繁体   English   中英

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 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函数添加一个字符串元素,但是我不确定如何将这两个值一起存储在树中。

谢谢你的帮助。

您只需要将结构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函数,因为要插入树,您需要引用父指针。 希望这会有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM