[英]Convert Level Order Traversal to Inorder Traversal of a complete binary tree
给定数组中一棵完全二叉树的层序遍历,如何将所述树的中序遍历存储在给定的数组中,而不用构建树。 这就是我想出的。
void recurse (int *inp, int size_array, int *output, int iter_a, int &iter_b)
{
if (iter_a>=size_array)
return;
recurse (inp,size_array,output,2*iter_a+1,iter_b);
output[iter_b] = inp[iter_a];
iter_b++;
recurse (inp,size_array,output,2*iter_a+2,iter_b);
}
是否有针对上述问题的就地非递归 O(n) 解决方案?
这是我创建的函数,用于将数组 a 的 levelorder 遍历中的中序遍历存储在数组 e 中,n 是数组 a 的长度。设置初始 k = 0 和 x = 0。
void convert(long long int a[],long long int e[],long long int n,long long int k,long long int x)
{
if((2*k+1)>=n||(2*k+2)>=n)
return;
convert(a,e,n,2*k+1,x);
e[x]=a[k];
x++;
convert(a,e,n,2*k+2,x);
return;
}
这是将级别顺序转换为有序但不是就地的迭代解决方案
private class Entry{
int data;
int pos;
Entry(int data, int pos){
this.data = data;
this.pos = pos;
}
}
public void convertLevelToInorder(int[] levelOrder){
// nodes are stored from index 1
int len = levelOrder.length;
int[] inOrder = new int[len];
Stack<Entry> stack = new Stack<Entry>();
int pos = 1;
int count = 1;
while(!stack.isEmpty() || pos < len){
while(pos < len && levelOrder[pos] != -1 ){
stack.push(new Entry(levelOrder[pos],pos));
pos = pos*2;
}
Entry e = stack.pop();
inOrder[count++] = e.data;
pos = e.pos*2+1;
}
for(int i=1;i<len;i++)
System.out.print(inOrder[i] + " ");
System.out.println();
}
我使用的观察结果是,对于一个完整的二叉树(这可以很容易地更改为其他大小),从级别顺序到顺序的映射如下所示:
让完整的二叉树的大小为 (2^m) - 1 = n
G = (n+1)/2
然后观察到映射是(使用树大小的属性)
G...
G/2, G/2+G...
G/4, G/4+G/2, G/4+2G/2, G/4+3G/2...
等等等等……
直到 G/指数=1
也就是说,偏移量从 G 变为 1,而 iterable 是它的两倍。
void inorderconversion(int n,int *inp,int *out){
int G = (n+1)/2;
int temp = 1,fac = 1;
for(int i=0;i<temp;i++){
int j;
for(j=i;j<temp;j++){
int outindex=(2*(j-i)+1)*G, inindex=j+1;
out[(2*(j-i)+1)*G -1] = inp[j];
//printf("%d %d\n", outindex, inindex);
}
{
fac = fac*2;
temp = temp+fac;
}
i =j-1;
G = G/2;
if(G == 0){
break;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.