最简单的二叉树插入不起作用

时间:2015-04-19 20:31:04

标签: c++ binary-tree

#include<iostream>
using namespace std;

struct node{
    int data;
    node *left;
    node *right;
    node(int value = 0);
};
node::node(int value){
    data = value;
    left = NULL;
    right = NULL;
}


class LinkedList{
    public:
        node *root;
        LinkedList();
        bool isEmpty();
        void insertInto(int value, node *key);
};

LinkedList::LinkedList(){
    root = NULL;
}

bool LinkedList::isEmpty(){
    if(root == NULL) return true;
} 

void LinkedList::insertInto(int value, node* root){
    if (root == NULL)
    {
        node *n = new node(value);
        root = n;
    }
    else if(value <= root->data){
        insertInto(value, root->left);
    }
    else if(value > root->data){
        insertInto(value,root->right);
    }
}


int main() {
    cout<<"I am gonna write the insertion of a binary tree"<<"\n";
    LinkedList sample;
    if(sample.isEmpty()) cout<<"THe tree is empty"<<endl; else cout<<"The tree is NOT empty"<<endl;
    sample.insertInto(5,sample.root);

    if(sample.isEmpty()) cout<<"THe tree is empty"<<endl; else cout<<"The tree is NOT empty"<<endl;



    return 1;
}

我一直在研究这个问题已经有一段时间了,我似乎不明白为什么结果表明即使在添加值5之后树也是空的。另外请给出关于如何改进的提示。感谢

1 个答案:

答案 0 :(得分:2)

忽略我对您发布的代码的样式/结构所做的评论:

    void LinkedList::insertInto(int value, node* root){
        if (root == NULL)
        {
            node *n = new node(value);
            root = n;
        }

您未在此处通过引用传递node* root变量。相反,您需要将node* root的副本更改为指向您构建的新node对象。如果您希望此代码实际更改从main传入的sample.root变量的值,则必须通过引用传递root

    void LinkedList::insertInto(int value, node* &root){

因为LinkedList::insertInto无论如何都是成员函数,为什么要传入root呢? 您可以访问成员变量root,只需使用它即可。如果您仍然希望能够递归使用它,那么您可以使用该值创建一个公共函数,并将该调用作为私有版本,同时接受node*是一个参数。

以下是一些编码风格的建议,因为您要求它们:

最佳编码练习要求您将类的成员变量设为私有,并使用公共成员函数来操作您的类。这是出于各种不同的原因。这里有一个解释:
https://softwareengineering.stackexchange.com/questions/143736/why-do-we-need-private-variables

所以你的课程(并让我们称之为BinaryTree)会看起来像这样:

class BinaryTree{
    public:
        /*  functions  */
    private:
        node *root;
};

因此,不要让类的用户提供BinaryTree的根(因为我们无论如何都知道它没有意义),我们只是要求他们插入值,并自己提供root。

class BinaryTree{
    public:
        /*  other functions  */
        void insertInto(int value);
    private:
        void insertInto(int value, node* &n);
        node *root;
};

// Public version of the insertInto function
void insertInto(int value) {
    insertInto(value, root);
}

// Private helper function for insertInto
void insertInto(int value, node* &n) {
    if (n == NULL)
    {
        n = new node(value);
    }
    else if(value <= root->data){
        insertInto(value, root->left);
    }
    else if(value > root->data){
        insertInto(value,root->right);
    }
}

int main() {
    BinaryTree sample;
    sample.insertInto(5);
}