已知前序遍历和中序遍历重建二叉树

package exam;

/**
 * Created by Administrator on 2017/3/12.
 * 重建二叉树
 * 递归创建
 */
public class RebuiltTree {
    public static void   main(String[]args){
        int []qianxu={1,2,4,7,3,5,6,8};
        int [] zhongxu={4,7,2,1,5,3,8,6};
        BinaryTreeNode root = constructTrees(qianxu, zhongxu);
        printQianxu(root);
    }

    /**
     * 二叉树重建
     * @param qianxu
     * @param zhongxu
     * @return
     */
    private static BinaryTreeNode constructTrees(int[] qianxu, int[] zhongxu) {
        BinaryTreeNode root=new BinaryTreeNode(qianxu[0]); //每次的根节点
        int leftNum=0;//左子树数字个数
        for(int i=0;i<zhongxu.length;i++){
            if(root.data==zhongxu[i]){
                 break;
            } else {
                leftNum++;
            }
        }
        int rightnum=qianxu.length-1-leftNum; //右子数字个数
        if(leftNum>0){
            int[] leftqianxu=new int[leftNum];
            int[] leftzhongxu=new int[leftNum];
            for(int i=0;i<leftNum;i++){
                leftqianxu[i] = qianxu[i + 1];
                leftzhongxu[i] = zhongxu[i];
            }
              //递归构造左子树
            BinaryTreeNode leftRoot = constructTrees(leftqianxu, leftzhongxu);
            root.setLeft(leftRoot);
        }
        if(rightnum>0){
            int [] rightqianxu=new int[rightnum];
            int [] rightzhongxu=new int[rightnum];
            for(int i=0;i<rightnum;i++){
                rightqianxu[i]=qianxu[leftNum+i+1];
                rightzhongxu[i]=zhongxu[leftNum+1+i];
            }
            BinaryTreeNode rightroot=constructTrees(rightqianxu,rightzhongxu);
            root.setRight(rightroot);
        }
        return root;
    }
    private static class BinaryTreeNode{
        BinaryTreeNode left;
        BinaryTreeNode right;
        int data;
        BinaryTreeNode(int data){
              this(null,null,data);
        }

        public BinaryTreeNode(BinaryTreeNode left, BinaryTreeNode right, int data) {
            this.left=left;
            this.right=right;
            this.data=data;
        }

        public BinaryTreeNode getLeft() {
            return left;
        }

        public void setLeft(BinaryTreeNode left) {
            this.left = left;
        }

        public BinaryTreeNode getRight() {
            return right;
        }

        public void setRight(BinaryTreeNode right) {
            this.right = right;
        }

        public int getData() {
            return data;
        }

        public void setData(int data) {
            this.data = data;
        }
    }
        public static void printPostOrder(BinaryTreeNode root) {
        if (root != null) {
            printPostOrder(root.getLeft());
            printPostOrder(root.getRight());
            System.out.print(root.getData() + "、");
        }
    }
    public static void printZhongxu(BinaryTreeNode root){
        if(root!=null){
            printZhongxu(root.getLeft());
            System.out.print(root.getData()+",");
            printZhongxu(root.getRight());
        }
    }
    public static void printQianxu(BinaryTreeNode root){
        if (root!=null){
            System.out.print(root.data+",");
            printQianxu(root.left);
            printQianxu(root.right);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值