将Level Order Traversal转换为完整二叉树的Inorder Traversal
Posted
技术标签:
【中文标题】将Level Order Traversal转换为完整二叉树的Inorder Traversal【英文标题】:Convert Level Order Traversal to Inorder Traversal of a complete binary tree 【发布时间】:2013-06-29 04:46:57 【问题描述】:给定数组中一棵完全二叉树的层序遍历,如何将所述树的中序遍历存储在给定的数组中,而不用建树。 这就是我想出的。
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) 解决方案?
【问题讨论】:
【参考方案1】:这是我创建的函数,用于将数组 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;
【讨论】:
【参考方案2】:这是一种将层级顺序转换为有序而不是就地的迭代解决方案
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();
【讨论】:
以上是关于将Level Order Traversal转换为完整二叉树的Inorder Traversal的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 103. Binary Tree Zigzag Level Order Traversal
leetcode103 Binary Tree Zigzag Level Order Traversal
[LeetCode]题解(python):107-Binary Tree Level Order Traversal II
[LeetCode]题解(python):103-Binary Tree Zigzag Level Order Traversal