将完全二叉树的层序遍历转换为中序遍历

3

如果有一个完全二叉树的层序遍历数组,如何将该树的中序遍历存储在给定的数组中,而不需要构建整棵树。以下是我的想法。

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)原地解决方案来解决这个问题?

3个回答

1
这是我创建的函数,用于将中序遍历存储在数组e中,从数组a的层序遍历中获取,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;
}

0

这是一种迭代解决方案,用于将层次遍历转换为中序遍历,但不是原地操作。

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();
}

0

我使用的观察结果是,对于完全二叉树(这可以轻松地改为其他大小),从层序到中序的映射如下:

假设完全二叉树的大小为(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/exponent=1

也就是说,偏移量从G到1,可迭代值为两倍。

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;
        }
        
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接