空二叉树创建C / C ++

时间:2014-12-10 15:14:02

标签: c++ recursion memory tree binary-tree

我需要创建一个包含7层的二叉树,所以我想是128个叶子。但是我需要在一开始就创建它,而不是逐个添加节点。 我猜是按顺序写了一个递归函数。但是问题是如何在创建第7层时结束递归。这是尝试过的:

bool tree::create(node *ptr)
{
    ptr = NULL;
    if (ptr->right->right->right->right->right->right->right)
        return true;
    ptr->left = new node;
    ptr->right = new node;
    ptr->left = NULL;
    ptr->right = NULL;
    create(ptr->left);
    create(ptr->right);
}

然而很容易看出,在第一次递归中尝试读取ptr->时会发生错误,因为它尚未创建。

有没有办法创建它,或者我应该放弃哪个会让我重新开始整个代码。

1 个答案:

答案 0 :(得分:0)

这两个陈述

ptr = NULL;
if (ptr->right->right->right->right->right->right->right)

导致未定义的行为并且没有意义。

您应该在函数中包含幻数7。否则,不清楚在函数的每次递归调用中需要创建多少级别。

如果要使用" C方法"那么函数看起来像

void tree::create( node **ptr, size_t n )
{
    if ( n )
    { 
        *ptr = new node;
        ( *ptr )->left  = NULL;
        ( *ptr )->right = NULL;

        create( &( *ptr )->left,  n - 1 );
        create( &( *ptr )->right, n - 1 );
    }
}

同样在C ++中,您只需使用node * &代替node **

void tree::create( node * &ptr, size_t n )
{
    if ( n )
    { 
        ptr = new node;
        ptr->left  = NULL;
        ptr->right = NULL;

        create( ptr->left,  n - 1 );
        create( ptr->right, n - 1 );
    }
}

这是一个演示程序,它是C ++和C代码之间的平均值。:)

#include <iostream>

struct node
{
    struct node *left;
    struct node *right;
    size_t i;
    node() : i( ++n )
    {
        std::cout << "creating node " << i << std::endl;
    }

    ~node()
    {
        delete left;
        delete right;
        std::cout << "deleting node " << i << std::endl;
    }

    static size_t n;
};

size_t node::n;

void create( node **ptr, size_t n )
{
    if ( n )
    { 
        *ptr = new node;
        ( *ptr )->left  = NULL;
        ( *ptr )->right = NULL;

        create( &( *ptr )->left,  n - 1 );
        create( &( *ptr )->right, n - 1 );
    }
}

void clear( node **tree )
{
    delete *tree;
    *tree = nullptr;
}


int main()
{
    node *tree;

    create( &tree, 3 );

    clear( &tree );

    return 0;
}

输出

creating node 1
creating node 2
creating node 3
creating node 4
creating node 5
creating node 6
creating node 7
deleting node 3
deleting node 4
deleting node 2
deleting node 6
deleting node 7
deleting node 5
deleting node 1