You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于现有二叉搜索树(BST)实现AVL树的继承设计?

基于现有BST实现AVL树的节点扩展与继承方案

针对你遇到的节点字段冲突问题,我们可以通过重构节点继承体系+模板参数化二叉树类的方式,在不破坏原有BST结构的前提下,优雅实现AVL树的继承扩展,核心思路是将公共节点逻辑抽离为基类,让BST和AVL节点各自继承并扩展特性,同时让二叉树类支持自定义节点类型。

1. 重构节点类的继承体系

首先定义一个包含公共字段的基类节点,再分别派生出BST节点和AVL节点:

基础节点基类(抽离公共逻辑)

template <class T>
class BaseNode {
protected:
    T _data;
    int _key;
    BaseNode* _left;
    BaseNode* _right;

public:
    BaseNode(int key, const T& data) 
        : _key(key), _data(data), _left(nullptr), _right(nullptr) {}

    // 公共接口,替代原有友元依赖
    int getKey() const { return _key; }
    void setKey(int key) { _key = key; }
    const T& getData() const { return _data; }
    T& getData() { return _data; }
    BaseNode*& left() { return _left; }
    BaseNode* left() const { return _left; }
    BaseNode*& right() { return _right; }
    BaseNode* right() const { return _right; }
};

BST节点类(复用基类,无额外字段)

template <class T>
class BSTNode : public BaseNode<T> {
public:
    BSTNode(int key, const T& data) : BaseNode<T>(key, data) {}
};

AVL节点类(添加高度字段及平衡相关方法)

#include <algorithm>

template <class T>
class AVLNode : public BaseNode<T> {
private:
    int _height;

public:
    AVLNode(int key, const T& data) 
        : BaseNode<T>(key, data), _height(1) {}

    int getHeight() const { return _height; }
    void setHeight(int height) { _height = height; }
    
    // 自动更新当前节点高度(基于左右子树高度)
    void updateHeight() {
        int leftH = this->left() ? static_cast<AVLNode<T>*>(this->left())->getHeight() : 0;
        int rightH = this->right() ? static_cast<AVLNode<T>*>(this->right())->getHeight() : 0;
        _height = std::max(leftH, rightH) + 1;
    }
};

2. 重构BinaryTree类,支持模板化节点类型

将原BinaryTree改为接受节点类型作为模板参数,并将核心操作声明为虚函数,方便AVL树重写:

template <class T, class NodeType = BSTNode<T>>
class BinaryTree {
protected:
    NodeType* _root;
    int _order; // 保留原有的节点数字段

    // BST递归插入逻辑(protected,供子类复用)
    NodeType* insertBST(NodeType* node, int key, const T& data) {
        if (!node) {
            _order++;
            return new NodeType(key, data);
        }
        if (key < node->getKey()) {
            node->left() = insertBST(static_cast<NodeType*>(node->left()), key, data);
        } else if (key > node->getKey()) {
            node->right() = insertBST(static_cast<NodeType*>(node->right()), key, data);
        }
        // 重复键直接返回原节点(可根据需求调整)
        return node;
    }

    // BST递归删除逻辑(protected,供子类复用)
    NodeType* removeBST(NodeType* node, int key) {
        if (!node) return nullptr;
        if (key < node->getKey()) {
            node->left() = removeBST(static_cast<NodeType*>(node->left()), key);
        } else if (key > node->getKey()) {
            node->right() = removeBST(static_cast<NodeType*>(node->right()), key);
        } else {
            _order--;
            // 处理叶子节点/单子节点情况
            if (!node->left()) {
                NodeType* temp = static_cast<NodeType*>(node->right());
                delete node;
                return temp;
            } else if (!node->right()) {
                NodeType* temp = static_cast<NodeType*>(node->left());
                delete node;
                return temp;
            }
            // 处理双子节点:找后继节点替换
            NodeType* temp = minNode(static_cast<NodeType*>(node->right()));
            node->setKey(temp->getKey());
            node->getData() = temp->getData();
            node->right() = removeBST(static_cast<NodeType*>(node->right()), temp->getKey());
        }
        return node;
    }

    // 找最小节点(辅助删除逻辑)
    NodeType* minNode(NodeType* node) {
        while (node->left()) {
            node = static_cast<NodeType*>(node->left());
        }
        return node;
    }

    // 递归销毁节点
    void destroy(NodeType* node) {
        if (node) {
            destroy(static_cast<NodeType*>(node->left()));
            destroy(static_cast<NodeType*>(node->right()));
            delete node;
        }
    }

public:
    BinaryTree() : _root(nullptr), _order(0) {}
    virtual ~BinaryTree() { destroy(_root); }

    // 虚函数:供AVL树重写
    virtual void insert(int key, const T& data) {
        _root = insertBST(_root, key, data);
    }

    virtual bool remove(int key) {
        NodeType* oldRoot = _root;
        _root = removeBST(_root, key);
        return oldRoot != _root; // 根据根是否变化判断删除成功
    }

    int getOrder() const { return _order; }
};

3. 实现AVLTree类:继承并重写核心方法

AVL树继承自BinaryTree,复用BST的插入/删除逻辑,仅添加平衡处理:

template <class T>
class AVLTree : public BinaryTree<T, AVLNode<T>> {
private:
    using BaseTree = BinaryTree<T, AVLNode<T>>;
    using NodeType = AVLNode<T>;

    // 获取平衡因子
    int getBalance(NodeType* node) {
        if (!node) return 0;
        int leftH = node->left() ? static_cast<NodeType*>(node->left())->getHeight() : 0;
        int rightH = node->right() ? static_cast<NodeType*>(node->right())->getHeight() : 0;
        return leftH - rightH;
    }

    // 右旋转
    NodeType* rightRotate(NodeType* y) {
        NodeType* x = static_cast<NodeType*>(y->left());
        NodeType* T2 = static_cast<NodeType*>(x->right());

        x->right() = y;
        y->left() = T2;

        y->updateHeight();
        x->updateHeight();
        return x;
    }

    // 左旋转
    NodeType* leftRotate(NodeType* x) {
        NodeType* y = static_cast<NodeType*>(x->right());
        NodeType* T2 = static_cast<NodeType*>(y->left());

        y->left() = x;
        x->right() = T2;

        x->updateHeight();
        y->updateHeight();
        return y;
    }

    // AVL递归插入(复用BST插入+平衡处理)
    NodeType* insertAVL(NodeType* node, int key, const T& data) {
        node = static_cast<NodeType*>(BaseTree::insertBST(node, key, data));
        if (!node) return node;

        node->updateHeight();
        int balance = getBalance(node);

        // 处理四种失衡情况
        if (balance > 1 && key < node->left()->getKey()) return rightRotate(node);
        if (balance < -1 && key > node->right()->getKey()) return leftRotate(node);
        if (balance > 1 && key > node->left()->getKey()) {
            node->left() = leftRotate(static_cast<NodeType*>(node->left()));
            return rightRotate(node);
        }
        if (balance < -1 && key < node->right()->getKey()) {
            node->right() = rightRotate(static_cast<NodeType*>(node->right()));
            return leftRotate(node);
        }

        return node;
    }

    // AVL递归删除(复用BST删除+平衡处理)
    NodeType* removeAVL(NodeType* node, int key) {
        node = static_cast<NodeType*>(BaseTree::removeBST(node, key));
        if (!node) return node;

        node->updateHeight();
        int balance = getBalance(node);

        // 处理四种失衡情况
        if (balance > 1 && getBalance(static_cast<NodeType*>(node->left())) >= 0) return rightRotate(node);
        if (balance > 1 && getBalance(static_cast<NodeType*>(node->left())) < 0) {
            node->left() = leftRotate(static_cast<NodeType*>(node->left()));
            return rightRotate(node);
        }
        if (balance < -1 && getBalance(static_cast<NodeType*>(node->right())) <= 0) return leftRotate(node);
        if (balance < -1 && getBalance(static_cast<NodeType*>(node->right())) > 0) {
            node->right() = rightRotate(static_cast<NodeType*>(node->right()));
            return leftRotate(node);
        }

        return node;
    }

public:
    using BaseTree::BaseTree; // 继承基类构造函数

    void insert(int key, const T& data) override {
        this->_root = insertAVL(this->_root, key, data);
    }

    bool remove(int key) override {
        NodeType* oldRoot = this->_root;
        this->_root = removeAVL(this->_root, key);
        return oldRoot != this->_root;
    }
};

方案优势

  1. 无侵入式扩展:原有BST的Node和BinaryTree逻辑无需修改,仅通过继承和模板参数实现扩展。
  2. 职责分离:BST节点专注于基础存储,AVL节点负责平衡相关字段,二叉树类专注于通用树操作。
  3. 代码复用:AVL树直接复用BST的插入/删除核心逻辑,仅添加平衡处理,符合开闭原则。

内容的提问来源于stack exchange,提问作者Sublezuber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:12:07