二叉树的根为空

Binary Tree root is null

本文关键字:二叉树      更新时间:2023-10-16

我试图创建一个二叉搜索树,但它似乎不工作。我调试过了,它说根是空的。我不明白为什么它是空的。我在构造函数中最初将其设置为null,但是当我调用insert()方法时,它不再为null,对吧?有人能帮我理解一下吗?谢谢。

#include "stdafx.h"
    #include <iostream>
using namespace std;

struct node
{
public:
    int value;
    node * left;
    node * right;
};

class bTree
{
public:
    node * root;
public:
    bTree();
    void insert(node * r, int val);
    void insert(int val);
    void traversePreorder();
    void traversePreorder(node * r);

};
bTree::bTree()
{
    root = NULL;
}
void bTree::insert(node * r, int val)
{
    if (r == NULL)
    {
        r = new node();
        r->value = val;
        r->left = NULL;
        r->right = NULL;
        return;
    }
    else
    {
        if (val <= r->value)
        {
            insert(r->left, val);
        }
        else
        {
            insert(r->right, val);
        }
    }
}
void bTree::insert(int val)
{
    insert(root, val);
}
void bTree::traversePreorder(node * r)
{
    if (root == nullptr)
        return;
    else
    {
        cout << root->value << " ";
        traversePreorder(root->left);
        traversePreorder(root->right);
    }
}
void bTree::traversePreorder()
{
    traversePreorder(root);
}
int main()
{
    bTree * myTree = new bTree();
    myTree->insert(30);
    myTree->insert(40);
    myTree->insert(20);
    myTree->insert(10);
    myTree->insert(50);

    myTree->traversePreorder();
    return 0;
}

如果您调试到void bTree::insert(node * r, int val),您会发现root根本没有改变。

void bTree::insert(node * r, int val)中,r是按值传递的,所以函数内部r (new等)的变化与外部变量(root)无关。您可以将其更改为通过引用传递:

void bTree::insert(node *& r, int val)

参见按引用传递和按值传递的区别?
如何在c++中传递对象到函数?

BTW:在void bTree::traversePreorder(node * r)中,您应该使用r,而不是root:

void bTree::traversePreorder(node * r)
{
    if (r == nullptr) 
        return;
    else
    {
        cout << r->value << " ";
        traversePreorder(r->left);
        traversePreorder(r->right);
    }
}
生活