您的位置:首页 > 编程语言 > Java开发

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

2016-05-14 23:04 507 查看
注意点;

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

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

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

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

代码如下:

package offer.fkr.A;

//利用先序遍历和中序遍历重新构建二叉树;

 // 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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 二叉树 遍历