递归地创建给定深度的完整二叉树

时间:2014-10-16 07:14:53

标签: algorithm recursion tree

如果树深度深度,则返回深度的完整二叉树。
树结构定义为:

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指针指向错误的节点。但我无法找到他们陷入混乱的原因。

任何人都可以帮助我,谢谢。

1 个答案:

答案 0 :(得分:2)

您没有为节点分配足够的空间:sizeof(BTNode),而不是sizeof(node)