二叉搜索树

时间:2015-01-07 18:39:25

标签: c++ binary-search-tree

我有以下代码插入bst但是,它无法插入除root之外的所有节点。知道我做错了什么吗?

class Node
{
public:
    int data;
    Node* right;
    Node* left;
    Node(int data)
    {
        this->data = data;
    }
    Node() {}
};

class BST
{
public:
    Node* head;
    void insert(int data)
    {
        if (head == nullptr)
        {
            head = new Node(data);
            head->data = data;
        }
        else
        {
            // head = new Node(data);
            insertNode(data, head);
        }
    }

    void insertNode(int data, Node* head)
    {
        if (head == nullptr)
        {
            head = new Node(data);
            return;
        }
        if (head)
        {
            Node* temp = head;
            if (temp->data > data)
            {
                insertNode(data, temp->left);
            }
            else if (temp->data <= data)
                insertNode(data, temp->right);
        }
    }
};

3 个答案:

答案 0 :(得分:5)

insertNode中的参数head会隐藏名为head的成员变量。

然而,虽然这是一个非常糟糕的做法,但另一个答案是你的错误的真正原因,所以请选择他的答案(当然,一旦你开始工作)。

我建议将insertNode的签名更改为

void insertNode(int data, Node*& node)

此外,您不需要在插入中检查head == nullptr。您在insertNode

中有重复检查

因此插入可能如下所示:

void insert(data) {
    insertNode(data, head);
}

最后,您没有在构造函数中初始化head。可能会将head初始化为nullptr以外的其他内容,特别是如果您在发布模式下编译它。添加如下构造函数:

BST() : head(nullptr) {
    // Other init stuff here if necessary
}

您还希望Node* head成为私人数据成员而非公开成员。

答案 1 :(得分:2)

insertNode()获取指针的副本,因此在函数内部进行的更改不会影响树中的实际指针。你想要做的是引用指针:

void insertNode(int data, Node*& head)

答案 2 :(得分:0)

在你的功能中#34; insertNode&#34;你正在使用if(head),这个if只有在head == 1时才有效,而head永远不等于1,因为它是一个指针,所以这个&#34;如果&#34;不管用。!