中序和前/后序遍历构造二叉树———通用做法

1. 前序和中序遍历

在这里插入图片描述

**思路:我们每一次一定可以根据递归确定根节点是哪个,就是前序第一个数,然后找中序遍历这个点,看左子树有几个节点,右子树有几个节点,然后就可以根据节点个数,递归左子树和右子树,当且仅当left>right时结束,由于preorder和inorder对应的所以left>right只需要判断一个符不符合就行了。**8个位置的判断一定要仔细。借助hashmap确定中序遍历某个节点的位置。

class Solution {
    Map<Integer,Integer> mp = new HashMap();
    int n;
    TreeNode PreMidTreeBuilder(int[] preorder,int[] inorder,
            int preorder_left, int preorder_right, int inorder_left, int inorder_right){
        if(preorder_left>preorder_right) return null;
        TreeNode root = new TreeNode(0,null,null);
        int rootNodeVal = preorder[preorder_left];
        root.val = rootNodeVal;
        //定位到中序遍历的位置
        int inorderRoot = mp.get(rootNodeVal);
        //可以根据坐标定下来左右子树的节点数量
        int leftLength = inorderRoot-inorder_left;
        int rightLength = inorder_right-inorderRoot;
        root.left=
            PreMidTreeBuilder(preorder,inorder,preorder_left+1,preorder_left+leftLength,
                            inorder_left,inorderRoot-1);    
        root.right=
            PreMidTreeBuilder(preorder,inorder,preorder_left+leftLength+1,preorder_right,
                            inorderRoot+1,inorder_right);
        return root;
    }
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        n = preorder.length;
        for(int i=0;i<n;i++)
            mp.put(inorder[i],i);
        return PreMidTreeBuilder(preorder,inorder,0,n-1,0,n-1);
    }
}

2. 中序和后序遍历

和前序+中序完全一样的思路,可以说所有这种题都是这个思路。

class Solution { 
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode buildInPostTree(int[] inorder, int[] postorder,
                    int inorder_left,int inorder_right,int postorder_left,int postorder_right)
    {
        if(inorder_left>inorder_right)return null;
        int val = postorder[postorder_right];
        int inorder_root = map.get(val);
        int nums_left_tree = inorder_root-inorder_left;
        int nums_right_tree = inorder_right-inorder_root;
        TreeNode root = new TreeNode(val,null,null);
        root.left = buildInPostTree(inorder,postorder,inorder_left,inorder_left+nums_left_tree-1,
                                    postorder_left,postorder_left+nums_left_tree-1);
        root.right = buildInPostTree(inorder,postorder,inorder_root+1,inorder_right,
                                    postorder_right-nums_right_tree,postorder_right-1);
        return root; 
    }
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int n = inorder.length;
        for(int i=0;i<n;i++)
            map.put(inorder[i],i);
        return buildInPostTree(inorder,postorder,0,n-1,0,n-1);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值