如果树深度深度,则返回深度的完整二叉树。
树结构定义为:
typedef int Item;
// Define binary tree node
typedef struct node {
struct node *lchild;
Item item;
struct node *rchild;
} BTNode, *BTree;
我使用名为 CreateFullBTree 的函数递归创建二叉树。这里的功能是:
BTree CreateFullBTree(int depth)
{
static int tag = 1;
BTNode *node = CreateNode();
node -> item = tag;
tag++;
printf("%d, %p\n",node->item, node);
if (depth == 1) return node;
node -> lchild = CreateFullBTree(depth-1);
node -> rchild = CreateFullBTree(depth-1);
return node;
}
CreateNode 功能是:
BTNode* CreateNode()
{
BTNode *node = malloc(sizeof(node));
node -> lchild = NULL;
node -> rchild = NULL;
return node;
}
主要功能:
int main(int argc, const char *argv[])
{
int depth;
scanf("%d", &depth);
BTree pTree = CreateFullBTree(depth);
preOrder(pTree);
return 0;
}
在main函数中,我调用CreateFullBTree来获取完整的二叉树,然后调用preOrder函数输出每个节点的标记字段以检查树是否正确创建。 preOrder函数是:
void preOrder(BTree tree)
{
if (tree) {
printf("%d\n", tree->item);
preOrder(tree->lchild);
preOrder(tree->rchild);
}
return;
}
每次调用CreateFullBTree时,都会创建并标记新节点。然后我们检查当前深度是否达到1,这意味着我们到达了二叉树的底部。如果是这样,我们只返回新创建的节点,什么都不做。如果没有,该节点可以有左右儿童,然后我们让node->lchild = CreateFullBTree(depth-1)
和node->rchild = CreateFullBTree(depth-1)
。
但算法没有按预期工作,当我们将3作为树的深度时,preOrder
函数的输出很奇怪:1 2 5 6 7 7 4 6 7 5 6 7 7,似乎有些节点的lchild和rchild指针指向错误的节点。但我无法找到他们陷入混乱的原因。
任何人都可以帮助我,谢谢。
答案 0 :(得分:2)
您没有为节点分配足够的空间:sizeof(BTNode)
,而不是sizeof(node)
。