前中序,中后序建立二叉树 java算法

整体来说,两种情况都是根据各自顺序的特点进行分段递归处理,拼接而成的答案。

1.前序遍历第一个节点是根节点,从而可以确定出中序遍历根节点的位置,接着可以知道左边节点的数目,也就可以知道前序遍历根节点后面若干部分是左子树的节点,最后的部分是右子树的节点。

2.后序遍历最后一个节点是根节点,从而可以确定出中序遍历根节点的位置,接着可以知道左边节点的数目,也就可以知道后序遍历从最左边开始到若干部分是左子树的节点,接着的部分是右子树的节点。
(下面的代码纯记录,不再上注释)

在这里插入图片描述
(图源leetcode,侵删)

从前序与中序遍历序列构造二叉树

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

    private TreeNode generate(int[] preorder, int[] inorder, int preLeft, int preRight, int inLeft, int inRight) {
        if(preLeft>preRight)
            return null;
        int rootPreIdx=preLeft;
        int rootInIdx=map.get(preorder[rootPreIdx]);
        TreeNode root=new TreeNode(preorder[rootPreIdx]);
        int temp=rootInIdx-inLeft;
        root.left=generate(preorder,inorder,preLeft+1,preLeft+temp,inLeft,rootInIdx-1);
        root.right=generate(preorder,inorder,preLeft+temp+1,preRight,rootInIdx+1,inRight);
        return root;
    }

在这里插入图片描述
(图源leetcode,侵删)

从中序与后序遍历序列构造二叉树

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

    private TreeNode generate(int[] inorder, int[] postorder, int inLeft, int inRight, int postLeft, int postRight) {
        if(postLeft>postRight)
            return null;
        int rootPostIdx=postRight;
        int rootInIdx=map.get(postorder[rootPostIdx]);
        int temp=rootInIdx-inLeft;
        TreeNode root=new TreeNode(postorder[rootPostIdx]);
        root.left=generate(inorder,postorder,inLeft,rootInIdx-1,postLeft,postLeft+temp-1);
        root.right=generate(inorder,postorder,rootInIdx+1,inRight,postLeft+temp,postRight-1);
        return root;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值