C++ 二叉树

C++ Binary Tree

我目前正在使用 C++ 开发一个项目,该项目要求我将文本文件中的字母存储在二叉树中。我应该遍历字符串并将字母与字母出现的次数一起存储在树中。我不确定如何编写插入函数以使其同时存储字母和整数。到目前为止,这就是我在树中存储单个值的方式。

void BinaryTree::insert(TreeNode *&nodePtr, TreeNode *&newNode)
{
    if (nodePtr == NULL)
        nodePtr = newNode;
    else if (newNode->value < nodePtr->value)
        insert(nodePtr->left, newNode);
    else
        insert(nodePtr->right, newNode);
}

void BinaryTree::insertNode(int num)
{
    TreeNode *newNode = NULL;
    newNode = new TreeNode;
    newNode->value = num;
    newNode->left = newNode->right = NULL;
    insert(root, newNode);
}

这是程序的class:

class BinaryTree
{
    private:
        struct TreeNode
        {
            int value;
            TreeNode *left;
            TreeNode *right;
        };

        TreeNode *root;

        void insert(TreeNode *&, TreeNode *&);

    public:
        BinaryTree()
        {
            root = NULL;
        }
        void insertNode(int);
};

和 int main:

int main()
{
    string filename;
    string filedata;
    BinaryTree tree;
    fstream file;
    cout << "Please enter a filename: ";
    cin >> filename;

    file.open(filename.c_str(), ios::in);
    if (file)
    {
        while (file)
        {
            file >> filedata;
            //tree.insertNode(filedata, );
        }
        file.close();
    }
    else
    {
        cout << "ERROR: Cannot open file.";
    }

    return 0;
}

我假设我需要向 insertNode 函数添加一个字符串元素,但我不确定如何将这两个值一起存储在树中。

感谢您的帮助。

你只需要将 struct TreeNode 的结构更改为这个 ::

struct TreeNode
{
    char value; // to store the char value of string
    int count; // number of times the character has occured
    TreeNode *left;
    TreeNode *right; 
};

从您的代码看来,您打算使用 BST(如果节点的值小于根值,则向左移动,如果值大于根值,则向左移动),在这种情况下,您的 insertNodeinsert 函数完全错误。

你应该首先遍历树,使用正在考虑的字符,如果已经有一个特定值的节点,你增加它的计数,如果你命中一个空,那么你添加一个新节点。

因此,您的 insertinsertNode 函数应如下所示::

void BinaryTree::insertNode(char value)
{
    if(root == NULL) {
        root = new TreeNode;
        root->value = value;
        root->count = 1;
        root->left = root->right = NULL;
    } else {
        if(root->value > value)
            insert(root->left, root, value);
        else
            insert(root->right, root, value);
    }
}

void BinaryTree::insert(TreeNode *current, TreeNode *parent, char value)
{
    if (current == NULL) {
        TreeNode *newNode = new TreeNode;
        newNode->value = value;
        newNode->count = 1;
        newNode->left = newNode->right = NULL;
        if(parent->value > newNode->value)
            parent->left = newNode;
        else
            parent->right = newNode;
    }
    else if (current->value > value)
        insert(current->left, current, value);
    else
        insert(current->right, current, value);
}

在这里,我正在考虑您希望字符串的第一个字符作为二叉树的根。我不明白你为什么要为每个角色创建一个新节点。此外,您也不需要将指针的引用传递给函数,因为您在任何时候都不会修改指针。而且,我将 2 个变量传递给 insert 函数,因为您要插入到树中,所以您需要引用父指针。希望这能有所帮助!