leetcode_middle_94_106. Construct Binary Tree from Inorder and Postorder Traversal

题意:

给出一个二叉树的中序遍历和后序遍历的结果,还原构造出这颗树。


分析:

首先我们应该搞清楚中序遍历和后序遍历的原理。

其次,我们应该举个例子,用人脑的思维方式,来完成这个过程。再根据人脑的思维过程来思考怎么控制计算机来完成。

比如:

                                    1

                           2                3

                    4           5      6         7

后序:452 673 1

中序:425 1 673

对于后序数组,我们发现,根节点一定在数组的最后一个,左右子树的根节点也在对应的子数组的最后一个。

对于中序数组,我们发现,根节点在中间某个位置,但是可以确定的是,左子树的结点都在根节点的左边,右子树的结点根节点都在右边

所以,我们可以倒序遍历后序数组,将第一个数来构造根节点。

将根节点的左结点设置为递归的结果,将根节点的右结点也设置为递归的结果。

递归的参数变化可以用角标来限定子数组区间。

同时我们可以利用根节点的值在中序数组中找到这个数。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(inorder.length==0 || postorder==null)
            return null;
        return helper(inorder, postorder, postorder.length-1, 0, inorder.length-1);
    }
    
    private TreeNode helper(int[] inorder, int[] postorder, int rootindex, int start, int end){
        if(start > end){
            return null;
        }
        int rootval = postorder[rootindex];
        TreeNode root = new TreeNode(rootval);
        int index = findRootInInorder(rootval, inorder, start, end);
        int leftsize = end- index;
        root.left = helper(inorder, postorder, rootindex-1-leftsize, start, index-1);
        root.right = helper(inorder, postorder, rootindex-1, index+1, end);
        return root;
    }
    
    private int findRootInInorder(int rootval, int[] inorder, int start, int end){
        for(int i=start; i<=end; i++){
            if(inorder[i] == rootval){
                return i;
            }
        }
        return -1;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值