c++ - C++ 中的二叉搜索树

标签 c++ binary-search-tree

我正在学习 C++ 语言,并且正在尝试编写 BST,但是出了点问题。 我尝试将元素添加到空树中,root 为 NULL,但添加元素后 root 仍然是 NULL,尽管添加成功(我在 Debug模式下看到它,节点设置为 tmp)。我不知道为什么会这样。

struct Node
{
    int data;
    Node* left;
    Node* right;
};

struct Tree
{
    Node* root;
};

Tree createTree()
{
    Tree tmp;
    tmp.root = NULL;
    return tmp;
}

void addToNode(Node* node, int value)
{
    Node* tmp = new Node;
    tmp->data = value;
    tmp->left = NULL;
    tmp->right = NULL;
    if(node == NULL)
        node = tmp;
    else if(value >= node->data)
        addToNode(node->right, value);
    else
        addToNode(node->left, value);
}

void add(Tree* tree, int value)
{
    addToNode(tree->root, value);
}

int _tmain(int argc, _TCHAR* argv[])
{
    Tree tree = createTree();
    add(&tree, 10);
    printf("%d", tree.root->data);
    scanf("%*s");
    return 0;
}

最佳答案

当您将指针传递给函数时,您创建了指针的本地版本。这个局部变量 (node) 确实指向与您传递的外部指针相同的内存。但是,任何更改此变量(不是它指向的内存,而是指针变量本身)的尝试都只会更改局部变量。

所以你的 node 指向与你的 tree 相同的内存位置,但是 node 变量本身不等于 tree 变量,因此您的更改在外部函数中是不可见的。

这听起来很复杂,对不起,但它和下面的完全一样:

void foo( int a )
{
    a++;
}
int main()
{
    int var = 5;
    foo( var );
    std::cout << var;
}

当然在这种情况下 var 不会改变,在函数内部改变的是 a

要解决此问题,请传递对指针的引用而不是指针本身:

void addToNode(Node*& node, int value)

关于c++ - C++ 中的二叉搜索树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13288560/

相关文章:

algorithm - 高度为h的红黑树的最小节点数计算公式是什么?

c - 搜索二叉树C,字典顺序,下一个排列,递归

c - 如何在BST中搜索节点?

c# - 通过示例规划编程项目(C# 或 C++)

c++ - 关闭 GTK 窗口

C++ 自定义全局新建/删除覆盖系统库

c++ - 用C++设计一个有助于减少 "repetitive operations on objects"的小对象池

C++:在循环内部或外部声明一个 vector

c# - 在二叉搜索树中查找任意数据类型的值

计算二叉搜索树中的比较次数