带有指针的树结构

Tree Construction with pointers

本文关键字:结构 指针      更新时间:2023-10-16

我正试图创建一个函数,将键结构插入树中。该函数可以正确设置根,但在使用另一个键再次调用时不会设置分支。这是代码:

tree.h:

class tree{
    key *tree_root;
public:
    tree();
    //Constructor
    void treedestroy(key *root);
    //Tree destructor helper
    ~tree();
    //Destructor
    void insert(key* root, key *newkey, int disc);
};

从树类插入函数:

void tree::insert(key *root, key *newkey, int disc){
    if (root == NULL){
        root = newkey;
        return;
    }
    if (newkey->cord[disc] <= root->cord[disc])
        insert(root->left, newkey, (disc+1)%4);
    else if (newkey->cord[disc] > root->cord[disc])
        insert(root->right, newkey, (disc+1)%4);
}

我对C++指针有点缺乏经验,想知道如何修复这段代码,使其正确填充树?

我不完全确定您在这里的方法,但为了帮助您站稳脚跟,使用以下函数签名会有所帮助:

void insert(key*& root, key *newkey, int disc);

这通过引用传递根指针,这意味着函数内部所做的更改将"粘贴"到您传递的变量上

当前的函数修改函数的局部变量,而不会传播这些更改。

这篇文章是一篇平衡而快速的参考文章(我不能说它是否是最好的——这只是我发现的第一篇不错的文章(

  1. 如果在第一次调用时newkey为null,则root将保持为null。请确保方法调用正确。

  2. 我会放一个else而不是else if。如果它是一个二叉树,它要么等于,要么大于,要么小于。

  3. 它是否进入Insert_helper?为什么你没有把它包括在内,看起来很重要?我想它至少有那么远了。

root = newKey;

这不会修改实际根。它只是修改函数参数,该参数是调用intsert函数时指定的指针的副本。

正确的版本看起来像这样:

private:
void tree::insert_helper( key **root, key *newkey, int disc ) {
  if ( (*root) == NULL ) {
     *root = key;
  } else if (newkey->cord[disc] <= root->cord[disc]) {
     insert_helper( &((*root)->left), newkey, (disc+1)%4 );
  } else {
     insert_helper( &((*root)->right), newkey, (disc+1)%4);
  }
}
public:
void tree::insert( key *newKey, int disc ) {
    insert_helper( &tree_root, newkey, disc );
}

此外,您还必须确保"key"构造为左和右设置为NULL。树构造函数应该为tree_root 设置NULL