使用C++实现 AVL 添加

Implementing AVL add with C++?

本文关键字:添加 AVL 实现 C++ 使用      更新时间:2023-10-16

我正在尝试实现AVL树,但似乎在使用Node类的方式上遇到了问题。我收到错误 C4430:缺少第二个 getHeight 的类型说明符,我以为我将类型指定为子树的节点?

template <typename T>
class SetAVL
{
public:
int getHeight()
{
    return getHeight(root);
}
// Complaining about this line
int getHeight(const Node<T> *subtree)
{
    // If we are at a leaf
    if (subtree == NULL)
        return 0;
    return 1 + max(getHeight(subtree->left), getHeight(subtree->right));
}
void add(Node<T> *item)
{
    Node<T> *t = new Node<T>(item);
    insert(root, t);
}
void insert(Node<T> *root, Node<T> *t)
{
    if (root == NULL)
        root = t;
    else
    {
        if (t->item < root->item)
            insert(root->left, t);
        else if (t->item != root->item)
            insert(root->right, t);
        else
            delete t;
    }
}
protected:
    template <typename T>
    class Node
    {
    public:
        T item;
        Node *left;
        Node *right;
        int height;
        Node(T item)
        {
            this->item = item;
            this->left = NULL;
            this->right = NULL;
            this->height = 0;
        }
    }
    Node<T> *root;
    int treeSize;
}

似乎需要为左右点指定正确的类型

Node *left;
Node *right;

应该是

Node<T> *left;
Node<T> *right;

我在使用它之前移动了节点定义。顺便说一句,您在类节点定义的末尾丢失了一个";"。

template <typename T>
class SetAVL
{
protected:
    template <typename T>
    class Node
    {
    public:
        T item;
        Node<T> *left;
        Node<T> *right;
        int height;
        Node(T item)
        {
            this->item = item;
            this->left = NULL;
            this->right = NULL;
            this->height = 0;
        }
    };
    Node<T> *root;
    int treeSize;
public:
    int getHeight()
    {
        return getHeight(root);
    }
    int getHeight(const Node<T> *subtree)
    {
        // If we are at a leaf
        if (subtree == NULL)
            return 0;
        return 1 + max(getHeight(subtree->left), getHeight(subtree->right));
    }
    void add(Node<T> *item)
    {
        Node<T> *t = new Node<T>(item);
        insert(root, t);
    }
    void insert(Node<T> *root, Node<T> *t)
    {
        if (root == NULL)
            root = t;
        else
        {
            if (t->item < root->item)
                insert(root->left, t);
            else if (t->item != root->item)
                insert(root->right, t);
            else
                delete t;
        }
    }

};

希望对您有所帮助!