二叉树根为空 [英] Binary Tree root is null

查看:118
本文介绍了二叉树根为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个二进制搜索树,但是它似乎没有用.我调试了它,并说根为空.我不明白为什么它为空.我最初在构造函数中将其设置为null,但是当我调用insert()方法时,它不再为null,对吗?有人可以帮我理解这一点.谢谢.

I'm trying to create a binary search tree but it doesn't seem to be working. I debugged it, and it says the root is null. I don't understand why it is null. I set it to null initially in the constructor, but then when I call the insert() method, it is no longer null, right? Can someone help me understand this. Thanks.

#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根本不会更改.

If you debug into void bTree::insert(node * r, int val), you'll find that root does not get changed at all.

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

In void bTree::insert(node * r, int val), r is passed by value, so the change of r inside the function (new etc) has nothing to do with the outside variable (root). You could change it to pass by reference:

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

请参见按引用传递和按值传递有什么区别?
如何将对象传递给C ++中的函数?

顺便说一句:在void bTree::traversePreorder(node * r)中,您应该使用r,而不是root:

BTW: In void bTree::traversePreorder(node * r), you should use r, not root:

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

实时

这篇关于二叉树根为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆