首页 > 解决方案 > 二叉搜索树中的打印功能问题

问题描述

我的练习是在 BSTree 中插入元素并找到它的最大元素。在我这样做之后,它没有打印任何东西并且总是返回 0。我尝试使用打印功能,但它是相同的,我不知道原因。请帮忙。提前致谢 ............................................... ..................................................... ..................................................... …………

#include <iostream>

using namespace std;

struct BstNode {
    int data;
    BstNode *left;
    BstNode *right;

    BstNode(int data1, BstNode *left1 = nullptr, BstNode *right1 = nullptr) : data(data1), left(left1), right(right1) {}

    ~BstNode() {}

};

class BinTree {
private:
    BstNode *root;
public:
    BinTree() : root(NULL) {}

    ~BinTree() {}

    BstNode *Insert(int data, BstNode *root) {
        if (root == NULL) {
            root = new BstNode(data);
            return root;
        }
        while (data <= root->data) {
            if (root->left == NULL) {
                root->left = new BstNode(data);
            }
            Insert(data, root->left);
        }
        while (data <= root->data) {
            if (root->right == NULL) {
                root->right = new BstNode(data);
            }
            Insert(data, root->right);
        }
    }

    int FindMax() {
        MaxHelper(root);
    }

    int MaxHelper(BstNode *root) {
        if (root == NULL) {
            cout << "List is empty  ";
            return -1;
        } else if (root->right != NULL) {
            root = root->right;
        }
        return root->data;
    }

    void Preorder(BstNode *root) { //DLR
        if (root == NULL) {
            return;
        }
        cout << root->data;
        Preorder(root->left);
        Preorder(root->right);
    }


};

BstNode *root = new BstNode(10);

int main() {

    BinTree b;
    cout << b.Insert(5, root);
    cout<<b.Insert(6, root);
    cout << b.Insert(7, root);
    cout << b.FindMax();

    return 0;
}

标签: c++binary-tree

解决方案


首先,您必须在代码中包含注释,这样其他人才能理解。而且我在您的代码中发现了很多错误。

首先要注意的是,如果你有一个非 void 函数,它应该返回一些东西。

using namespace std;污染命名空间。因此,使用

using std::cout;
using std::endl;

如果您在文件中使用类,则无需单独的结构。尝试在类中实现它。

并且root == NULL可以更改为!root

并且您的 Insert 函数存在逻辑错误。

如果您在 if 语句中返回某些内容,则无需使用 else if,只需使用 if。

最好将两个单独的文件用于主文件和实现文件并将其用作头文件。

并保护您的头文件不被多次包含。

还有 bla bla bla ...;)

在这里,我纠正了你的一些错误。但不是全部,请尝试自己纠正所有问题。

#include <iostream>

using std::cout;
using std::endl;

struct BstNode
{
    int data;
    BstNode *left;
    BstNode *right;

    BstNode(int data1) : data(data1), left(NULL), right(NULL){};

    ~BstNode(){};
};

class BinTree
{
private:
    BstNode *root;

public:
    BinTree() : root(NULL) {}

    ~BinTree() {}

    BstNode *Insert(int data, BstNode *root)
    {
        if (!root)
        {
            return new BstNode(data);
        }
        if (data > root->data)
        {
            root->right = Insert(data, root->right);
        }
        else
        {
            root->left = Insert(data, root->left);
        }

        return root;
    }

    int FindMax(BstNode *root)
    {
        return MaxHelper(root);
    }

    int MaxHelper(BstNode *root)
    {
        if (!root)
        {
            return -1;
        }
        if (root->right)
        {
            root = root->right;
        }
        return root->data;
    }

    void Preorder(BstNode *root)
    {
        if (!root)
            return;
        Preorder(root->left);
        cout << root->data << " ";
        Preorder(root->right);
    }
};

int main()
{

    BstNode *root = new BstNode(10);
    BinTree b;
    b.Insert(5, root);
    b.Insert(6, root);
    b.Insert(7, root);
    b.Insert(11, root);
    cout << b.FindMax(root) << endl;
    b.Preorder(root);

    return 0;
}

推荐阅读