我需要创建一个包含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->时会发生错误,因为它尚未创建。
有没有办法创建它,或者我应该放弃哪个会让我重新开始整个代码。
答案 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