当前位置: 首页 > news >正文

AVLTree

二叉平衡树 BST树+节点平衡操作(节点平衡 任意节点左右字输的高度不超过1)

AVL树为了维护节点平衡引入了的四种节点旋转操作:

1.左孩子的左子树太高了

// 右旋转操作
child  = node->left;
node->left = child->right;
child->right = node;

 2.右孩子的右子树太高了

// 左旋转操作
child = node->right;
node->right = child->left;
child->left = node;

3.左孩子的右子树太高了

左-右旋转 左平衡操作

4.右孩子的左孩子太高了

右-左旋转 右平衡操作

#include <iostream>
#include <algorithm>

using namespace std;

// AVL树的实现
class AVLTree
{
private:
    struct Node
    {
        int key_;
        Node* left_;
        Node* right_;
        int height_;
        Node(int key) : key_(key), left_(nullptr), right_(nullptr), height_(1) {}
    };

    Node* root_;
public:
    AVLTree() : root_(nullptr) {}
    // 右旋转操作
    Node* rightRotate(Node* node)
    {
        Node* child = node->left_;
        node->left_ = child->right_;
        child->right_ = node;
        // 高度更新
        node->height_ = max(getHeight(node->left_), getHeight(node->right_)) + 1;
        child->height_ = max(getHeight(child->left_), getHeight(child->right_)) + 1;
        return child;
    }

    // 左旋转操作
    Node* leftRotate(Node* node)
    {
        Node* child = node->right_;
        node->right_ = child->left_;
        child->left_ = node;
        // 高度更新
        node->height_ = max(getHeight(node->left_), getHeight(node->right_)) + 1;
        child->height_ = max(getHeight(child->left_), getHeight(child->right_)) + 1;
        return child;
    }

    // 左平衡操作
    Node* leftBalance(Node* node)
    {
        node->left_ = leftRotate(node->left_);
        return rightRotate(node);
    }

    // 右平衡操作
    Node* rightBalance(Node* node)
    {
        node->right_ = rightRotate(node->right_);
        return leftRotate(node);
    }

    // AVL树的插入操作
public:
    Node* insert(Node* node, int key)
    {
        if (node == nullptr)
        {
            return new Node(key);
        }
        if (key < node->key_)
        {
            node->left_ = insert(node->left_, key);
            // 检查是否需要平衡
            if (getHeight(node->left_) - getHeight(node->right_) > 1)
            {
                if(getHeight(node->left_->left_) > getHeight(node->left_->right_))
                    // 左孩子的左子树太高
                    return rightRotate(node);
                else
                    // 左孩子的右子树太高
                    return leftBalance(node);
            }
        }
        else if(key > node->key_)
        {
            node->right_ = insert(node->right_, key);
            // 检查是否需要平衡
            if (getHeight(node->right_) - getHeight(node->left_) > 1)
            {
                if(getHeight(node->right_->right_) > getHeight(node->right_->left_))
                    // 右孩子的右子树太高
                    return leftRotate(node);
                else
                    // 右孩子的左子树太高
                    return rightBalance(node);
            }
        }
        // 因为子树中增加了新的节点,在递归回溯时检测更新节点高度
        node->height_ = max(getHeight(node->left_), getHeight(node->right_)) + 1;
        // 否则,key已经存在于树中,不需要插入
        return node;
    }

    void insert(int key)
    {
        root_ = insert(root_, key);
    }

private:
    // 获取节点的高度
    int getHeight(Node* node)
    {
        // 空节点高度为0
        return node == nullptr ? 0 : node->height_;
    }

    // 遍历并打印AVL树
public:
    void inorderTraversal(Node* node)
    {
        if (node == nullptr)
        {
            return;
        }
        inorderTraversal(node->left_);
        cout << node->key_ << " ";
        inorderTraversal(node->right_);
    }
public:
    Node* getRoot() { return root_; }

    // AVL树的删除操作
    Node* remove(Node* node, int key)
    {
        if (node == nullptr)
        {
            return nullptr;
        }
        if (key < node->key_)
        {
            node->left_ = remove(node->left_, key);

        }
        else if(key > node->key_)
        {
            node->right_ = remove(node->right_, key);
        }
        else
        {
            if(node->left_ != nullptr && node->right_ != nullptr)
            {
                
            }
        }   
    }

    // AVL树的查找操作
};

int main()
{
    AVLTree tree;
    // 插入一些测试数据
    tree.insert(10);
    tree.insert(20);
    tree.insert(30);
    tree.insert(40);
    tree.insert(50);
    tree.insert(25);

    tree.inorderTraversal(tree.getRoot());

    cout << "Test data inserted successfully." << endl;
    return 0;
}

相关文章:

  • 单片机串口打印调试信息①
  • AI卫浴官:机器学习如何预判您的生理时钟
  • uniapp uni-drawer组件vue3写法
  • 【C++经典例题】寻找字符串中第一个不重复字符的索引
  • C++STL(四):stack和queue的模拟实现
  • [python] 使用Python实现Markdown文档格式转换
  • Flutter 输入组件 Radio 详解
  • 2018扬州大学876农业机械学概论填空名词解释简答
  • 文件I/O--C++的文件操作
  • 风电资源评估的关键指标及其应用
  • Log4j2 的核心实现和源码分析
  • 电源滤波器在医用电气设备中的应用
  • HTML5 canvas圆形泡泡动画背景特效
  • 【Arm+Qt+Opencv】基于人脸识别考勤系统实战
  • Android系统深度定制:内置Google TTS语音引擎并设为默认的终极指南
  • 【Git】基础使用
  • 国际机构Gartner发布2025年网络安全趋势
  • GaussDB数据库表设计与性能优化实践
  • [特殊字符] C++ 常见 Socket 错误与优化指南
  • [深度学习]特征提取和无监督
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • 观众走入剧院空间,人艺之友一起“再造时光”
  • 为发期刊,高校学者偷贩涉密敏感数据!国安部披露间谍案细节
  • 王毅同巴基斯坦副总理兼外长达尔通电话
  • 肖峰读《从塞北到西域》︱拉铁摩尔的骆驼
  • 2025年4月份CPI环比由降转涨,核心CPI涨幅稳定