c++ 带阅读文件的二叉查找树

sdnqo3pr  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(100)

我是一名学习数据结构的学生。这是我的BST代码。在执行main函数期间,输出为

1
2
3
4

...并且“% s”不是输出,而是转储的核心。为什么...
下面是我的代码:

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

class Node {
public:
    string data = "";
    Node *par;
    Node *left;
    Node *right;
    Node() : data(""), par(nullptr), left(nullptr), right(nullptr) {}
};

class BST {
public:
    Node *v;

    BST() { v = nullptr; }
    
    Node *parent() const {
        if (v == nullptr)
            return nullptr;
        return v->par;
    }

    Node *left() const { return v->left; }

    Node *right() const { return v->right; }
  
    bool isRoot() const {
        if (v == nullptr)
            return false;
        return v->par == nullptr;
    }

    bool isExternal() const {
        if (v == nullptr)
            return false;
        return v->left == nullptr && v->right == nullptr;
    }

    bool isInternal() const {
        if (v == nullptr)
            return false;
        return v->left != nullptr || v->right != nullptr;
    }
    
    string &data() const { return v->data; }
 
    void addNode(const string &data) {
        Node *newNode = new Node();
        newNode->data = data;
        newNode->par = nullptr;
        newNode->left = nullptr;
        newNode->right = nullptr;
        if (isRoot()) { 
            v = newNode;
            return;
        } else {
            Node *current = v;
            while (true) {
                if (data < current->data) {
                    if (current->left == nullptr) {
                        current->left = newNode;
                        newNode->par = current;
                        return;
                    } else {
                        current = current->left;
                    }
                } else if (data > current->data) {
                    if (current->right == nullptr) {
                        current->right = newNode;
                        newNode->par = current;
                        return;
                    } else {
                        current = current->right;
                    }
                } else {
                    delete newNode;
                    return;
                }
            }
        }
    }

    void printAncestors(Node *node) {
        if (node == nullptr)
            return;
        cout << node->data << endl;
        printAncestors(node->par);
    }

    void clear(Node *node) {
        if (node == nullptr)
            return;
        clear(node->left);
        clear(node->right);
        if (node->par != nullptr) {
            if (node->par->left == node)
                node->par->left = nullptr;
            else if (node->par->right == node)
                node->par->right = nullptr;
        }
        delete node;
    }

    Node *getRoot() const { return v; }
};

int main() {
    BST *inputTree = new BST();
    BST *outputTree = nullptr;

    for (int i = 1; i <= 50; i++) {
        string input = "inputs/input." + to_string(i) + ".txt";
        string output = "outputs/output." + to_string(i) + ".txt";
        ifstream inputFile(input);
        if (!inputFile) {
            cerr << "Failed to open input file: " << input << endl;
            continue;
        }  
        ////////////////////////// this part! //////////////////////////
        string line;
        int lineNumber = 0;
        while (getline(inputFile, line)) {
            lineNumber++;
            cout << lineNumber << endl;
            if (lineNumber >= 4) {
                cout << "s";
                inputTree->addNode(line);
            }
        }
        ////////////////////////// this part! //////////////////////////
        inputFile.close();
        inputTree->printAncestors(inputTree->getRoot());
        inputTree->clear(inputTree->getRoot());
    }
    delete inputTree;
    delete outputTree;
    return 0;
}

这里是输入文件的一部分

charlotte philip joe
jesse mary sandra
8
gabriel theresa diane
marie raymond joshua
jesse mary sandra
charlotte philip joe
alexis jose shirley
diana anna kyle
susan james janice
joe ethan isabella

我想调用addNode将字符串添加到BST中,从输入的第4行到它的末尾。

ggazkfy8

ggazkfy81#

“% s”不是输出,而是转储的核心。为什么...
s未输出,因为它仍在输出缓冲区中。如果你想看到输出,那么输出一个换行符,像这样:

cout << "s" << endl;

现在您将在输出中看到它。
关于核心转储。这是因为你在下面的语句中遵从了一个空指针:

if (data < current->data) {

第一次执行时,currentnullptr,因为vnullptr,而isRoot()返回0。函数isRoot检查是否存在一个节点,并且该节点是根节点。因为你的树是空的,所以没有这样的节点。但是调用代码显然期望在树为空时进入if块。因此,您需要检查并纠正此错误。
当您使用调试器并在代码中设置断点和检查变量时,很容易检测到此类问题。

相关问题