根据树的先续和中序遍历,求一个树。
本来以为是很简单的一个问题,结果写起程序来,还是有点麻烦的事情
思想:
- 根据先根数组找到根root
- 然后拿着root到中根数组中将数组一分为二,形成左右子树
- 对左右子树进行递归
左子将数组再次分割,根据右子将数组再次分割,所以根据这个规律,直接用Tree保存刚好
代码:
public class GetTree {
//先根 + 中根 = 树
//将一颗树保存到数组中
private static int[]preTree = {1,2,4,7,5,3,6}; // 树的先续遍历
private static int[]inTree = {7,4,2,5,1,3,6}; // 树的中序遍历
private static int[]tree; //保存找到的树 根 i 左子 =2*i+1 右子=2*i+2
private static int count; //保存满二叉树节点个数
public static void main(String[] args) {
tree = new int[100];
process(0, 0, inTree.length, 0);
be_Traverse(0);
}
public static void process(int m,int p,int q,int flag) {
//根 preTree[m];
if (m >= preTree.length || p > q){
return ;
}
int i;
tree[flag] = preTree[m];
if (flag > count){
count = flag;
}
for (i=p; i<=q && preTree[m]!=inTree[i]; i++);
process(m+1, p, i-1, 2*flag+1);
process(m+i-p+1, i+1, q, 2*flag+2);
}
public static void be_Traverse(int i){
if (i > count){
return;
}
be_Traverse(2*i+1);
be_Traverse(2*i+2);
System.out.println(tree[i]);
}
}
写完程序后发现,如果中序遍历中有节点的值干扰(即和根节点值相同)了根节点的查找,是不是不能还原出整棵树,反正上面程序是不能还原的