【问题标题】:Null Binary Tree Creation C/C++空二叉树创建 C/C++
【发布时间】:2015-02-08 20:26:09
【问题描述】:

我需要创建一个有 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->right 时会发生错误,因为它尚未创建。

有什么方法可以创建或者我应该放弃这将导致我重新开始整个代码。

【问题讨论】:

  • 如果您想更改ptr,您的签名应如下所示bool tree::create(node *& ptr){。另请注意 if (ptr->right->right->right->right->right->right->right) 调用未定义的行为。
  • 您的代码完全是一团糟,我认为您应该重新开始整个代码,但现在尝试逐步了解您在做什么。靠猜测编程是行不通的。
  • 我认为你的意思是上面提到的“未定义行为”的内存违规,你是正确的参考调用。谢谢
  • @AhmetYılmaz:不,他真的是指 UB。 “访问冲突”是一种可能的(且相当无害的)表达方式。
  • @AhmetYılmaz 访问冲突是这里可能发生的最安全的事情。如果成功了,那就更危险了。

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


【解决方案1】:

这两条语句

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

【讨论】:

  • @Ahmet Yılmaz 欢迎您。如果您确实认为这个唯一的答案解决了您的问题,那么将其标记为这样。
  • 我的错,我忘了这样做。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2019-07-27
  • 2014-10-26
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多