[leetcode刷题]——剑指offer

  此篇博客主要记录剑指offer中遇到的不会的题。

 

一、重建二叉树(剑指offer 07)

medium  2021-06-22

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

  解题思路:前序遍历的特点,根节点在第一位; 中序遍历的特点,根节点在中间,左右子树分别在两侧。

    可以先利用前序遍历找出根节点,然后递归寻找左右子树的根节点。

    这个题我断断续续写了两三天都没写出来,放弃了

  

class Solution {
    private Map<Integer, Integer> indexMap;
    public TreeNode myBuildTree(int[] preorder, int[] inorder, int pre_left, int pre_right, int in_left,
                               int in_right){
        if(pre_left > pre_right){
            return null;
        }
        int pre_root = pre_left; //最左边的序号就是这个子树的根节点的序号
        int in_root = indexMap.get(preorder[pre_root]);//找到中序遍历的根节点
        int left_tree_length = in_root - in_left; //左子树的长度
        TreeNode root = new TreeNode(preorder[pre_root]);
        root.left = myBuildTree(preorder, inorder, pre_left + 1, pre_left + left_tree_length,
                               in_left, in_root - 1);
        root.right = myBuildTree(preorder, inorder,pre_left + left_tree_length + 1, pre_right, 
                                in_root + 1, in_right);
        return root;   
    }   
    
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = preorder.length;
        indexMap = new HashMap<>();
        for(int i = 0; i < n; i++){
            indexMap.put(inorder[i], i);
        }
        return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
    }
}

 

上一篇:顺序存储二叉树


下一篇:二刷剑指Offer面试题07:重建二叉树