C 从数组按级别顺序创建二叉树
我正在研究一个小算法,它可以按级别顺序构建二叉树。我得到一个数组,我必须使用数组中的值按级别顺序构建一个二叉树。例子: arr-inarr[5]={1,2,3,4,5} 给定这样一个数组,我需要填充一个二叉树,如下所示:C 从数组按级别顺序创建二叉树,c,arrays,algorithm,binary-tree,C,Arrays,Algorithm,Binary Tree,我正在研究一个小算法,它可以按级别顺序构建二叉树。我得到一个数组,我必须使用数组中的值按级别顺序构建一个二叉树。例子: arr-inarr[5]={1,2,3,4,5} 给定这样一个数组,我需要填充一个二叉树,如下所示: 1 / \ 2 3 / \ / \ 4 5 * * (*为空) 这些节点是基本的二进制节点,具有一个左右指针和一个用于保存数组值的int的空格 我理解根据树的高度遍历树的概念,一次遍历一个层次,但我
1
/ \
2 3
/ \ / \
4 5 * *
(*为空)
这些节点是基本的二进制节点,具有一个左右指针和一个用于保存数组值的int的空格
我理解根据树的高度遍历树的概念,一次遍历一个层次,但我不确定以这种方式构建树的正确逻辑 按级别遍历树的“自然”方式是使用队列。因此,直观地说,进行反向运算的算法可以使用队列来记忆下一个要处理的节点
这种算法将遵循以下原则:
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;
}
Node*根据级别顺序构建(int a[],int n)
{
队列q;//这是指向节点的指针队列
Node*root=(Node*)malloc(sizeof(Node));
root->key=a[0];root->left=root->right=NULL;
q、 放(根);
对于(int i=1;ikey=a[i++];l->left=l->right=NULL;
p->左=l;
q、 put(l);
如果(ikey=a[i++];r->left=r->right=NULL;
p->right=r;
q、 put(r);
}
}
返回根;
}
在O(n)中构建一个空树,如果数组已排序,则可以按顺序遍历它并相应地填充节点。你构建的树是一个完整的二叉树,从右边删除叶子,因此匹配你的数组大小@FireSun的可能重复项我检查了你报告的帖子,发现可能重复项,事实是我没有发现任何关系。你能检查一下吗?如果arrinar[5]={3,1,2,4,5},是否会建立同一棵树代码>?