【问题标题】:Binary Tree root is null二叉树根为空
【发布时间】:2015-12-06 04:02:26
【问题描述】:

我正在尝试创建一个二叉搜索树,但它似乎不起作用。我调试了它,它说根为空。我不明白为什么它是空的。我最初在构造函数中将其设置为 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;
}

【问题讨论】:

    标签: c++ class pointers binary-tree binary-search-tree


    【解决方案1】:

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

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

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

    What's the difference between passing by reference vs. passing by value?
    How to pass objects to functions in C++?

    顺便说一句:在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);
        }
    }
    

    LIVE

    【讨论】:

    • 你能解释一下另一件事吗,我知道我应该问一个单独的问题,但它非常切题。为什么 addNode() 函数在此链接link 中看到的我的链表实现中起作用,因为该函数正在传递节点指针并且能够在没有引用的情况下对其进行操作?只是有点困惑。谢谢!
    • @smokenstein 是的。它是通过指针传递的,并且您正在更改指针指向的内容,(而不是指针本身)它是有效的。
    猜你喜欢
    • 2021-12-27
    • 2015-08-28
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多