JAVA二叉树,给出先序遍历和中序遍历,构造出新的二叉树

注意点;

1.确定整棵二叉树的根节点即先序遍历中的第一个元素root

2.确定root在中序遍历元素的位置,root左边的元素为二叉树的左子树元素Lchild,右边为右子树元素Rchild

3.在先序遍历中找到最先出现Lchild中元素的那个元素,为Lchild的根节点——root的左孩子节点,同理找出Rchild的根节点——root的右孩子节点

4.重复2,3步骤直至二叉树构建完成;

 

 

代码如下:

//利用先序遍历和中序遍历重新构建二叉树;
// Definition for binary tree
class TreeNode {
    int val;

    TreeNode left;

    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}


public class reConstructBinaryTree {
    //重新构建二叉树
    public static TreeNode reConstructBinaryTree1(int[] pre, int[] in) {//pre先序遍历,in中序遍历
        if (pre.length == 0 || in.length == 0 || pre.length != in.length) {
            return null;
        }//如果没有遍历,或者遍历不一致,则返回为null
        TreeNode root = new TreeNode(pre[0]);//定义二叉树的根节点
        int i = 0;
        while (in[i] != pre[0]) {//找到根节点再中序遍历里的位置,
            i++;
        }
// 中序遍历中,根节点左侧为左子树节点,右侧为右子树节点
        int[] preLeft = new int[i];//左子树先序遍历
        int[] inLeft = new int[i]; //左子树中序遍历
        int[] preRight = new int[pre.length - i - 1];//右子树先序遍历
        int[] inRight = new int[in.length - i - 1];//右子树中序遍历
        for (int j = 0; j < in.length; j++) {
            if (j < i) {
                preLeft[j] = pre[j + 1];
                inLeft[j] = in[j];
            } else if (j > i) {
                preRight[j - i - 1] = pre[j];
                inRight[j - i - 1] = in[j];
            }
        }
        root.left = reConstructBinaryTree1(preLeft, inLeft);//递归构建左子树
        root.right = reConstructBinaryTree1(preRight, inRight);//递归构建右子树
        return root;//返回重新构建二叉树
    }


    public static void last(TreeNode tr) {//后序遍历遍历二叉树
        if (tr == null) {
            return;
        }
        last(tr.left);
        last(tr.right);
        System.out.print(tr.val + " ");
    }


    public static void main(String[] args) {
        int[] a = {1, 2, 4, 7, 3, 5, 6, 8};
        int[] b = {4, 7, 2, 1, 5, 3, 8, 6};
        TreeNode root = reConstructBinaryTree1(a, b);
        last(root);
        System.out.println();
    }
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值