leetcode889.ConstructBinaryTreefromPreorderandPostorderTrav

N0.889
题目:给出二叉树的先序遍历和后序遍历的结果,求一组层次遍历的结果
别人思路:先序遍历 根左右;后序遍历 左右根
一般遇到二叉树的题都用递归求解。很明显,先序和后序复原的二叉树是不唯一,
我们只需要根据某种规律恢复可能的一种二叉树。
比如,可以根据先序遍历找到第一个子树的头结点,作为左子树。
(1)先序遍历序列的第一个元素一定是根节点.
(2)先序遍历序列的第二个元素是根节点的左子树的根节点.
(3)后序遍历序列的根节点临近的前一个节点是根节点的右子树的根节点.

class Solution {
    public TreeNode constructFromPrePost(int[] pre, int[] post) {
        TreeNode node = buildTree(pre, post, 0, pre.length-1) ;
        return node ;
    }
    TreeNode buildTree(int[] pre, int[] post, int begin, int end){
        if(begin>end){
            return null ;
        }
        if(begin == end){
            return new TreeNode(pre[begin]) ;
        }
        TreeNode root = new TreeNode(pre[begin]) ;
        int eval = 0 ;
        int pb = 0 ;
        //在后序遍历的序列中,获取右子树的根,然后获取其在先序遍历的序列中索引位置
        for(int i=0;i<pre.length;i++){
            if(post[i] == pre[begin]){
                if(i>0){
                    eval = post[i-1] ;
                }
            }
        }
        for(int i=0;i<pre.length;i++){
            if(pre[i] == eval){
                pb = i ;
            }
        }
        root.left = buildTree(pre, post, begin+1, pb-1) ;
        root.right = buildTree(pre, post, pb, end) ;
        return root ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值