输入前序和中序二叉树遍历的结果,重建出该二叉树。
直接上代码,可以参考代码中的相关注释。
首先定义树的结点结构,如下:
package tree;
public class Tree {
public int val;
public Tree left_child;
public Tree right_child;
public Tree(int val){
this.val=val;
}
public void display(){
System.out.println(val+" ");
}
}
通过已知的遍历结果迭代实现二叉树的重建,如下:
package tree;
public class ConstructTree{
public Tree construct(int[] pre,int[] in){
if(pre.length ==0 || in.length == 0)
return null;
Tree head = buildTree(pre,0,pre.length-1,in,0,in.length-1);
return head;
}
public Tree buildTree(int[] preOrder, int begin1, int end1, int[] inOrder, int begin2, int end2) {
// TODO Auto-generated method stub
if(begin1>end1||begin2>end2){
return null;
}
int rootData = preOrder[begin1];//前序的第一个数字总是树的根节点包含的数值
Tree head = new Tree(rootData);//初始化树的根节点
int divider = findIndexInArray(inOrder,rootData,begin2,end2);//找到根节点的值在中序遍历数组中的位置(索引下标)
int offSet = divider -begin2 -1;//在中序遍历数组中,左子树最后一个结点的下标
Tree left = buildTree(preOrder,begin1+1,begin1+1+offSet,inOrder,begin2,begin2+offSet);
Tree right = buildTree(preOrder,begin1+offSet+2,end1,inOrder,divider+1,end2);
head.left_child = left;
head.right_child = right;
return head;
}
private int findIndexInArray(int[] a, int x, int begin, int end) {
// TODO Auto-generated method stub
for(int i = begin;i<=end;i++){
if(a[i]==x)
return i;
}
return -1;
}
public void inOrder(Tree n){
if(n!=null){
inOrder(n.left_child);
System.out.print(n.val+" ");
inOrder(n.right_child);
}
}
public void preOrder(Tree n){
if(n!=null){
System.out.print(n.val+" ");
preOrder(n.left_child);
preOrder(n.right_child);
}
}
public static void main(String[] args){
ConstructTree build =new ConstructTree();
int[] preOrder = {1,2,4,7,3,5,6,8};
int[] inOrder = {4,7,2,1,5,3,8,6};
Tree root = build.construct(preOrder, inOrder);
build.preOrder(root);//检验构建的二叉树前序遍历是否正确
System.out.println();
build.inOrder(root);//检验构建的二叉树中序遍历是否正确
}
}
1 2 4 7 3 5 6 8
4 7 2 1 5 3 8 6