我正在研究一种按层次顺序构建二叉树的小算法。我得到一个数组,我必须使用它中的值来按级别顺序构建二叉树。例: arr inarr [5] = {1,2,3,4,5};
给定这样的数组我需要填写二进制树,如下所示:
1
/ \
2 3
/ \ / \
4 5 * *
(*为NULL) 节点是具有左右指针的基本二进制节点,以及用于保存数组值的int的空间。
我理解基于它的高度遍历树的概念,你一次只能在一个层次上移动它,但我不确定正确构建它的正确逻辑。
答案 0 :(得分:0)
"自然"按级别遍历树的方法是使用队列。因此,直观地说,执行逆操作的算法可以使用队列来记忆下一个要处理的节点。
这种算法可以使用以下原则:
0
q
有下一个要处理的节点i
和i+1
。请注意,级别遍历可以保证这种情况。所以以下伪代码从包含其按层次遍历
的数组构建树Node * build_from_level_order(int a[], int n)
{
Queue q; // this is a queue of pointers to nodes
Node * root = (Node*) malloc(sizeof(Node));
root->key = a[0]; root->left = root->right = NULL;
q.put(root);
for (int i = 1; i < n; /* advancing of i is inside */)
{
Node * p = q.get();
Node * l = (Node*) malloc(sizeof(Node));
l->key = a[i++]; l->left = l->right = NULL;
p->left = l;
q.put(l);
if (i < n) // last level could end in a left node, this test prevents to see an inexistent right node
{
Node * r = (Node*) malloc(sizeof(Node));
r->key = a[i++]; r->left = r->right = NULL;
p->right = r;
q.put(r);
}
}
return root;
}