【JZOF】已知前序遍历和中序遍历,求出其后序遍历

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如:前序遍历序列{ 1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8,6},打印出它的后序遍历

public class BinaryTree {

   public static final class BinaryTreeNode{
       int value;
       BinaryTreeNode left;
       BinaryTreeNode right;
    }


    public static BinaryTreeNode construct(int[] priorTree,int[] innerTree){
       if (priorTree==null||innerTree==null||innerTree.length<1||priorTree.length<1){
           return null;
       }

       return construct(priorTree,0,priorTree.length-1,innerTree,0,innerTree.length-1);
    }

    private static BinaryTreeNode construct(int[] priorTree, int ps, int pe, int[] innerTree, int is, int ie) {
        if (ps>pe){
            return null;
        }
        int value=priorTree[ps];
        int index=is;
        //找出中序遍历的根节点的位置,其左边的排列都是其左子树,右边是root的右子树
        while(index<=ie){
            if (innerTree[index]==value) {
                break;
            }else {
                index++;
            }
        }
        BinaryTreeNode root=new BinaryTreeNode();
        root.value=value;

        root.left=construct(priorTree,ps,ps+index-is,innerTree,0,index-1);
        root.right=construct(priorTree,ps+index-is+1,pe,innerTree,index+1,ie);
        return root;
    }

   //打印后序遍历
    public static void paint(BinaryTreeNode root){
        while (root!=null){
            paint(root.left);
            paint(root.right);
            System.out.println(root.value);
        }
    }
}
复制代码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值