剑指 Offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例:

img

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

题解:

1.从前序遍历中我们可以确定的是,树的根节点和左右子树的根节点。

2.利用前序遍历得到的信息,我们可以从中序遍历中根据树的根节点来划分左右子树。

3.因为左右子树已经划分好并且左右子树的根节点也已经知道,所以我们可以开启递归来重构二叉树。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int[] preorder;//保存前序遍历
    HashMap<Integer, Integer> dic = new HashMap<>();//标记中序遍历的位置
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder=preorder;
        for(int i =0;i<inorder.length;i++){
            dic.put(inorder[i],i);
        }
        return recur(0,0,inorder.length-1);//开启递归
    }
    //root 前序遍历的根节点位置,left左边界,right右边界
    TreeNode recur(int root, int left, int right) {
        if(left>right) return null;//结束递归
        TreeNode node = new TreeNode(preorder[root]);//保存根节点
        int i = dic.get(preorder[root]);//划分好左右子树
        //左子树的根节点为树根节点在中序遍历的位置+1,
        //左子树的左边界不变,
        //右边界为中序遍历中树根节点的位置-1
        node.left = recur(root+1,left,i-1);
        //右子树的根节点为数根节点在中序遍历的位置+左子树节点数量+1,
        //右子树的左边界为树根节点在中序遍历的位置+1,
        //右子树的右边界不变
        node.right = recur(root+i-left+1,i+1,right);
        return node;
    }
}
posted @ 2022-01-08 17:41  zeliCouer  阅读(22)  评论(0编辑  收藏  举报