TypechoJoeTheme

Toasobi的博客

重建二叉树(中等)

本文最后更新于2023年03月03日,已超过566天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

这道题就是要你根据前序和中序遍历的结果让你构建一课二叉树

这题当时我都不会做

答案使用递归的方法,就是说当一个问题可以分为多次重复的子问题时,我们就应该想到递归,总结下来,该题就是通过分析两个遍历数组,运用map存中序对应的元素下标,先用前序找到根节点,再去map中对应下标,在中序数组中在根节点左边的就是左子树,右边就是右子树,然后循环这个任务,构建这棵数

<div>
class Solution {
    private Map<Integer, Integer> indexMap;

    public TreeNode myBuildTree(int[] preorder,int[] inorder,int pre_first,int pre_last,
    int in_first, int in_last){
        //终止条件
        if(pre_first>pre_last || in_first>in_last){
            return null;
        }

        //通过前序遍历找到根节点
        int root_val = preorder[pre_first];
        TreeNode root = new TreeNode(root_val);

        //定位根节点
        int root_index = indexMap.get(preorder[pre_first]);

        //左子树的个数
        int leftSize = root_index-in_first;

        //递归构造左,右子树
        root.left = myBuildTree(preorder,inorder,pre_first+1,pre_first+leftSize,in_first,in_first+leftSize-1);
        //构建右子树
        root.right = myBuildTree(preorder,inorder,pre_first+leftSize+1,pre_last,root_index+1,in_last);
        return root;
    }



    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = inorder.length;
        indexMap = new HashMap<Integer, Integer>();
       for(int i=0;i<inorder.length;i++){
           indexMap.put(inorder[i],i);
       }
       return myBuildTree(preorder,inorder,0,n-1,0,n-1);

    }
}
</div>
朗读
赞(0)
评论 (0)