重建二叉树

对于一颗二叉树来说,有了前序和中序或者中序和后序就可以确定这颗二叉树,我们就可以重建它了。
一般先考虑前序的序列,它的第一个数就是这个二叉树的根节点,然后我们遍历中序序列,找到这个根节点后;在它左边的序列就构成了根节点的左子树,右边的序列就构成了根节点的右子树。
下面的事情就好办了,我们只需要递归左边的序列和右边序列,注意我们还是需要回到前序序列来确定左边序列的根节点和右边序列的根节点。这样才能进行下一次的划分,所以后面的过程就是重复递归,然后划分,然后递归直到只有一个节点了。

public class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int val){
        this.val=val;
    }
}

public TreeNode reconstructBinaryTree(int[] pre,int[] in){
    TreeNode root=reconstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
    return root;
}
public TreeNode reconstructBinaryTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){
    if(startPre>endPre||startIn>endIn)
        return null;
    TreeNode root=new TreeNode(pre[startPre]);//startPre not 0!
    //从startIn开始,序列会随着递归不断被划分,分割的更小! 
    for(int i=startIn;i<=endIn;i++){
        //找根节点在中序序列的位置
        if(in[i]==pre[startPre]){
        //i-startIn是中序序列中左边部分的节点个数,startPre+(i-startIn)就是前序左边部分的最后一个元素的下标
            root.left=reconstructBinaryTree(pre,startPre+1,startPre+(i-startIn),in,startIn,i-1);
        //对于前序来说,前面已经得到startPre+(i-startIn) ,右边序列就肯定是紧跟在它后面,所以就是startPre+(i-startIn)+1了! 
            root.right=reconstructBinaryTree(pre,startPre+(i-startIn)+1,endPre,in,i+1,endIn);
        }
    }
    return root;
}

对于根据中序和后序来重建二叉树的话,要利用的是后序是最后一个节点为根节点,中序还是一样利用它划分左边部分和右边部分的,我们仍然是利用后序找到根节点,然后扫描中序找到根节点所在的下标,然后划分两个左右子树,后续过程仍然是递归实现。对于后序序列,不同之处也就是左边和右边子序列的下标会有所不同。

root.left=reconstructBinaryTree(post,startPost,startPost+(i-startIn)-1,in,startIn,i-1);
root.right=reconstructBinaryTree(post,startPost+(i-startIn),endPost-1,in,i+1,endIn)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值