树类的节点出错,可能是因为专用节点成员

Error with Node of Tree Class, perhaps because of private Node members

本文关键字:节点 是因为 专用 成员 出错      更新时间:2023-10-16

所以我一直在测试一个树节点类,遇到了一些错误。我认为这是因为我使用私有Node成员,并使用访问器函数来访问它们。使用del函数,我试图在PostOrder中遍历时打印和删除测试树,但除了"根"之外,没有任何输出。

#include <iostream>
#include <string>
using namespace std;
#ifndef TREENODE_H
#define TREENODE_H
template <class T>
class TreeNode
{
private:
    typedef TreeNode<T>* nodePtr;
    T data;
    nodePtr lst;
    nodePtr rst;
public:
    TreeNode()
    {
        lst = NULL;
        rst = NULL;
    };
    TreeNode(T d)
    {
        data = d;
        lst = NULL;
        rst = NULL;
    };
    TreeNode(const TreeNode<T>* other)
    {
        data = other.data;
        lst = other.lst;
        rst = other.rst;
    };
    void setData(T d)
    {
        data = d;
    }
    T getData()
    {
        return data;
    }
    void setLeft(nodePtr l)
    {
        lst = l;
    }
    void setRight(nodePtr r)
    {
        rst = r;
    }
    nodePtr getLeft()
    {
        return lst;
    }
    nodePtr getRight()
    {
        return rst;
    }
    ~TreeNode()
    {
        cout << "gone: " << data;
    }
};
#endif

#include <iostream>
#include <string>
#include "TreeNode.cpp"
using namespace std;

void recInsert(string a, TreeNode<string>* current)
{
    if (current == NULL)
    {
        current = new TreeNode < string > ;
        current->setData(a);
        current->setLeft(NULL);
        current->setRight(NULL);
    }
    else if (a <= current->getData())
        recInsert(a, current->getLeft());
    else recInsert(a, current->getRight());
};
void del(TreeNode < string > *current)
{
    if (current != NULL)
    {
        del(current->getLeft());
        del(current->getRight());
        cout << current->getData();
        delete current;
    }
}
int main()
{
    TreeNode<string>* a;
    a = new TreeNode <string>;
    a->setData("hi");
    recInsert("ho", a);
    recInsert("bo", a);
    recInsert("ao", a);
    recInsert("lo", a);
    del(a);
}

如果要添加一个左或右子节点,recInsert函数将接收到指向节点的指针,而不是指向指针的指针或指向指针的引用。因此,您正在更改函数参数,而不是子节点。这里有一个快速解决方案:

void recInsert(string a, TreeNode<string>*& current) {
    // The same code
}

下面是一些背景阅读:指向指针的指针和指向指针的引用