当前位置: 首页 > 图灵资讯 > 技术篇> 剑指 Offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树

来源:图灵教育
时间:2023-08-06 09:42:58

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

假设输入的前序遍历和中序遍历的结果中没有重复的数字。

示例 1:

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

Input: preorder = [-1], inorder = [-1]Output: [-1]

限制:

0 <= 节点个数 <= 5000

    int[] preorder;    HashMap<Integer, Integer> map = new HashMap<>();    // 前序遍历 preorder: 根 -- 左 -- 右   第一个必须是根节点    // 中序遍历 inorder: 左 -- 根 -- 右    public TreeNode buildTree(int[] preorder, int[] inorder) {        this.preorder = preorder;        for(int i = 0; i < inorder.length; i++){            map.put(inorder[i], i);        }        return rebuild(0, 0, inorder.length - 1);      }    // pre_root_index : 根节点 在 在前序遍历中下标    // in_left_index: 该节点在中序遍历中的左边界    // in_right_index: 该节点在中序遍历中的右边界    public TreeNode rebuild(int pre_root_index, int in_left_index, int in_right_index){       if(in_left_index > in_right_index)  return null;       // 中序遍历中根节点的位置:in_root_index       int in_root_index = map.get(preorder[pre_root_index]);       // 创建根节点       TreeNode node = new TreeNode(preorder[pre_root_index]);       // 左节点寻找node:        // 前序遍历中的位置是  根节点下标 + (一个单位在右边)       // 在中序遍历中的位置是: 1. 左边界保持不变,2. 右边的边界是根节点左边的单位 in_root_index - 1       node.left = rebuild(pre_root_index + 1, in_left_index, in_root_index - 1);       // 寻找node的右节点:        // 前序遍历中的位置是  根节点下标 + 左子树长度 + 1       // 在中序遍历中的位置是: 1. 根节点右侧的单位左边界  in_root_index + 1, 2. 右边界不变       node.right = rebuild(pre_root_index + in_root_index - in_left_index + 1, in_root_index + 1, in_right_index);       return node;    }}