分三步走
(1)确定树的根节点。树根是当前树中所有元素在先序遍历中最先出现的元素,即先序遍历的第一个结点就是二叉树的跟
(2)求解树的子树。找到根在中序遍历的位置,位置左边就是二叉树的左孩子,位置右边是二叉树的右孩子,如果跟结点左边或右边为空,那么该方向子树为空;如果根节点左边和右边都为空,那么根节点已经为叶子节点。
(3)对二叉树的左、右孩子分别进行步骤(1)(2),直到求出二叉树的结构为止。
代码实现如下:
public class BinaryTree {
private Node root;
public BinaryTree(){
root = null;
}
//后序遍历方法递归实现
public void postOrder(Node localRoot){
if(localRoot!=null){
postOrder(localRoot.left);
postOrder(localRoot.right);
System.out.print(localRoot.data+" ");
}
}
public void postOrder() {
this.postOrder(this.root);
}
public void initTree(int[] preOrder,int[] inOrder){
this.root = this.initTree(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1);
}
public Node initTree(int[] preOrder,int start1,int end1,int[] inOrder,int start2,int end2){
if(start1>end1||start2>end2){
return null;
}
int rootData = preOrder[start1];
Node head = new Node(rootData);
//找到根节点所在位置
int rootIndex = findIndexInArray(inOrder,rootData,start2,end2);
//构建左子树
Node left = initTree(preOrder,start1+1,start1+rootIndex-start2,inOrder,start2,rootIndex-1);
//构建右子树
Node right = initTree(preOrder,start1+rootIndex-start2+1,end1,inOrder,rootIndex+1,end2);
head.left = left;
head.right = right;
return head;
}
public int findIndexInArray(int[] a,int x,int begin,int end){
for(int i = begin;i<=end; i++){
if(a[i]==x){
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] preOrder = {1,2,4,8,9,5,10,3,6,7};
int[] inOrder = {8,4,9,2,10,5,1,6,3,7};
BinaryTree biTree = new BinaryTree();
biTree.initTree(preOrder, inOrder);
System.out.print("二叉树的后序遍历:");
biTree.postOrder();
}
}