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);
}
}
}
已知前序遍历和中序遍历重建二叉树
最新推荐文章于 2024-06-17 16:18:02 发布