Jus*_*irt 6 c arrays algorithm binary-tree
我正在研究一种按级别顺序构建二叉树的小型算法。给我一个数组,我必须使用其中的值按级别顺序构建二叉树。示例:arr inarr[5]={1,2,3,4,5};
给定一个这样的数组,我需要填写一个二叉树,如下所示:
1
/ \
2 3
/ \ / \
4 5 * *
Run Code Online (Sandbox Code Playgroud)
(* 为 NULL)节点是基本的二进制节点,具有左指针和右指针以及保存数组中值的 int 空间。
我理解根据树的高度遍历树的概念,并且一次移动一层,但我不确定以这种方式正确构建它的正确逻辑。
按级别遍历树的“自然”方法是使用队列。因此,直观地说,执行相反操作的算法可以使用队列来记忆下一个要处理的节点。
这种算法将遵循以下原则:
0q有下一个要处理的节点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;
}
Run Code Online (Sandbox Code Playgroud)