假设树的先序序列和中序序列分别为
preorder = {7,10,4,3,1,2,8,11}
inorder = {4,10,3,1,7,11,8,2}
1.将中序序列存储在hashmap中,key存储节点的值,value存储节点在中序序列中的下标。
public void map(int[] order){
int n = order.length;
for(int i = 0;iorder[i], i);
}
}
2.利用先序序列和中序序列构造,代码如下;
//index为本次递归所对应树的根节点在先序序列的下标
//n 为该树的节点数
//off 为该树在中序序列中左边界,通过off和根节点在中序序列的下标 便可得出左子树的节点数
//preorder,index 对应于先序序列
//n,off对应于中序序列
public TreeNode buildPre(int[] preorder,int index,int n ,int off){
if(0==n){
return null;
}
int rootVal = preorder[index];
TreeNode root = new TreeNode(rootVal);
//hashMap.get(rootVal)获得该树根节点在中序序列中的下标,该下标减去该树对应的左边界off
//即为该根节点对应的左子树的节点个数
int i = hashMap.get(rootVal)-off; //i为左子树的节点个数
//对左子树递归,先序遍历格式为{ 根,{左子树},{右子树} },若根节点下标为index,则
//其左子树的根节点下标为index+1.左子树在中序序列的左边界为off
root.left = buildPre(preorder,index+1,i,off);
//在先序序列{ 根,{左子树},{右子树} }中,由于知道的左子树节点个数i,便可知道右子树的根
//所对应的下标index+i+1
//该树节点数n 减去左子树节点数i和1 即为右子树节点数。
//由于中序序列为{{左子树},根,{右子树} },hashMap.get(rootVal)+1 即为右子树根
//在中序序列中的左边界
root.right = buildPre(preorder,index+i+1,n-i-1,hashMap.get(rootVal)+1);
return root;
}
3.利用后序序列和中序序列构造:
public TreeNode buildPost(int[] hostorder,int index,int n ,int off){
if(n == 0){
return null;
}
int rootVal = hostorder[index];//获得根节点
TreeNode t = new TreeNode(rootVal);
int i = off - hashMap.get(rootVal);//得到右子树节点的个数
t.right = buildPost(hostorder,index-1,i,off);
t.left = buildPost(hostorder,index-i-1,n-i-1,hashMap.get(rootVal)-1);
return t;
}
可以找个例子,模拟程序运行下,便对程序的运行过程更清晰一些。
参考:http://blog.csdn.net/sgbfblog/article/details/7783935#comments