程序不显示插入二叉搜索树中的值

Program not showing the values inserted in a binary search tree

我曾尝试编写代码来实现二叉搜索树,但是当我 运行 我的代码不输出任何内容并关闭程序时。我认为我的插入函数是正确的,因为我在插入函数的多个地方写了 cout<<"yes" ,并显示了我在顺序遍历中使用的二叉搜索树的所有节点,这是在一个简单的函数中递归完成的。 这是我的代码:

#include <iostream>
using namespace std;

class Node
{
public:
    int data;
    Node *right;
    Node *left;
};

void insert(Node **root_ref, int value)
{
    Node *temp = new Node();
    temp->data = value;
    temp->right = NULL;
    temp->left = NULL;
    Node *current = *root_ref;
    if (*root_ref == NULL)
    {
        *root_ref = temp;
        return;
    }
    while (current != NULL)
    {
        if ((temp->data < current->data) && (current->left == NULL))
        {
            current->left = temp;
            return;
        }
        else if ((temp->data > current->data) && (current->right == NULL))
        {
            current->right = temp;
            return;
        }
        else if ((temp->data > current->data))
        {
            current = current->right;
        }
        else
        {
            current = current->left;
        }
    }
}

void printinorder(Node *root1)
{
    printinorder(root1->left);
    cout << " " << root1->data << " ";
    printinorder(root1->right);
}

int main()
{
    Node *root = NULL;
    insert(&root, 60);
    insert(&root, 50);
    insert(&root, 70);
    insert(&root, 30);
    insert(&root, 53);
    insert(&root, 80);
    insert(&root, 65);
    printinorder(root);
}

对于初学者来说,当一个值被添加到树中时,如果已经有一个具有相同值的节点,函数 insert 可能会产生内存泄漏,因为在这种情况下只能评估这个 else 语句

while (current != NULL)
{
    //...
    else
    {
        current = current->left;
    }
}

所以循环将结束它的迭代,尽管已经分配了一个节点,但不会向树中添加任何内容。

函数可以写成下面这样的例子

void insert( Node **root_ref, int value )
{
    Node *temp = new Node { value, nullptr, nullptr };

    while ( *root_ref != nullptr )
    {
        if ( ( *root_ref )->data < value )
        {
            root_ref = &( *root_ref )->right;
        }
        else
        {
            root_ref = &( *root_ref )->left;
        }
    }

    *root_ref = temp;
}

在递归函数中printinorder

void printinorder(Node *root1)
{
    printinorder(root1->left);
    cout << " " << root1->data << " ";
    printinorder(root1->right);
}

您没有检查传递的参数是否等于 nullptr。所以函数调用了未定义的行为。

函数可以这样写

std::ostream & printinorder( const Node *root, std::ostream &os = std::cout )
{
    if ( root != nullptr )
    {
        printinorder( root->left, os );
        os << " " << root->data << " ";
        printinorder( root->right, os );
    }

    return os;
}