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

平衡二叉树

介绍:平衡二叉树(AVL树)是一种自平衡的二叉搜索树,具有以下特点:任意节点的左右子树高度差不超过1。这种性质通过旋转操作来维持,以保持树的平衡性。

以下是一个简单的平衡二叉树的示例图表:
        10
       /  \
      5    15
     / \  /  \
    3   7 13  17

在C++中,我们可以使用类来实现平衡二叉树。下面是一个简单的示例代码:

```cpp
#include <iostream>

class Node {
public:
    int key;
    Node* left;
    Node* right;
    int height;

    Node(int k) : key(k), left(nullptr), right(nullptr), height(1) {}
};

class AVLTree {
private:
    Node* root;

    int getHeight(Node* node) {
        return (node == nullptr) ? 0 : node->height;
    }

    int getBalance(Node* node) {
        return (node == nullptr) ? 0 : getHeight(node->left) - getHeight(node->right);
    }

    Node* rightRotate(Node* y) {
        Node* x = y->left;
        Node* T = x->right;

        x->right = y;
        y->left = T;

        y->height = 1 + std::max(getHeight(y->left), getHeight(y->right));
        x->height = 1 + std::max(getHeight(x->left), getHeight(x->right));

        return x;
    }

    Node* leftRotate(Node* x) {
        Node* y = x->right;
        Node* T = y->left;

        y->left = x;
        x->right = T;

        x->height = 1 + std::max(getHeight(x->left), getHeight(x->right));
        y->height = 1 + std::max(getHeight(y->left), getHeight(y->right));

        return y;
    }

    Node* insert(Node* node, int key) {
        if (node == nullptr) {
            return new Node(key);
        }

        if (key < node->key) {
            node->left = insert(node->left, key);
        } else if (key > node->key) {
            node->right = insert(node->right, key);
        } else {
            return node;
        }

        node->height = 1 + std::max(getHeight(node->left), getHeight(node->right));
        int balance = getBalance(node);

        // Left Left Case
        if (balance > 1 && key < node->left->key) {
            return rightRotate(node);
        }
        // Right Right Case
        if (balance < -1 && key > node->right->key) {
            return leftRotate(node);
        }
        // Left Right Case
        if (balance > 1 && key > node->left->key) {
            node->left = leftRotate(node->left);
            return rightRotate(node);
        }
        // Right Left Case
        if (balance < -1 && key < node->right->key) {
            node->right = rightRotate(node->right);
            return leftRotate(node);
        }

        return node;
    }

public:
    AVLTree() : root(nullptr) {}

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

    void display(Node* node) {
        if (node != nullptr) {
            display(node->left);
            std::cout << node->key << " ";
            display(node->right);
        }
    }

    void displayTree() {
        display(root);
    }
};

int main() {
    AVLTree tree;
    tree.insert(10);
    tree.insert(5);
    tree.insert(15);
    tree.insert(3);
    tree.insert(7);
    tree.insert(13);
    tree.insert(17);

    std::cout << "AVL Tree: ";
    tree.displayTree();
    std::cout << std::endl;

    return 0;
}
```

以上代码演示了如何实现一个简单的平衡二叉树,并在其中插入一些节点。在实践中,还可以扩展这些基本操作以满足更多需求。


文章转载自:

http://7vfaGtFT.qkkmd.cn
http://H5a0ONrl.qkkmd.cn
http://wCd0hk2b.qkkmd.cn
http://k73W4R1u.qkkmd.cn
http://ZFPznSUg.qkkmd.cn
http://Sm12iJef.qkkmd.cn
http://KHltLmPS.qkkmd.cn
http://HZEmwjbQ.qkkmd.cn
http://vfb8GCFp.qkkmd.cn
http://EZgdbkDk.qkkmd.cn
http://tuKYyqQE.qkkmd.cn
http://ItzFJJGL.qkkmd.cn
http://wUcFYMGY.qkkmd.cn
http://4FSOfqwj.qkkmd.cn
http://qNb9wUo6.qkkmd.cn
http://j21yUcgF.qkkmd.cn
http://RdVGZRnj.qkkmd.cn
http://IVYenWVO.qkkmd.cn
http://aSZgrtMR.qkkmd.cn
http://S0P4tfA5.qkkmd.cn
http://oInbpE3Z.qkkmd.cn
http://A8lDAxu4.qkkmd.cn
http://mLUsz3yO.qkkmd.cn
http://tMD2HmL1.qkkmd.cn
http://qssxCpYG.qkkmd.cn
http://gn0HFjYA.qkkmd.cn
http://vw5h6IrE.qkkmd.cn
http://FhoBd73H.qkkmd.cn
http://zcYPMFpY.qkkmd.cn
http://nF9L8gKx.qkkmd.cn
http://www.dtcms.com/a/45589.html

相关文章:

  • web前端基础修炼手册
  • Android Logcat 高效调试指南
  • 【算法题解答·一】二分法
  • JavaScript知识点5
  • 新生校园报道小程序毕业系统设计
  • 内容中台与企业内容管理架构解析
  • 变电站蓄电池在线监测系统(论文+源码)
  • NIO是什么?它与传统的IO有什么区别?
  • 网络运维学习笔记(DeepSeek优化版)009网工初级(HCIA-Datacom与CCNA-EI)路由理论基础与静态路由
  • 计算机毕设-基于springboot的社团管理系统的设计与实现(附源码+lw+ppt+开题报告)
  • 无人机自主导航与避障技术!
  • python脚本将mysql数据写入doris
  • Ubuntu 下查看进程 PID 和终止进程方法
  • 【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系
  • JPA属性转换器的使用与实例解析
  • python中单例模式介绍(含线程安全的单例模式)
  • 第一个Vue项目笔记(待更新)
  • 从零基础到通过考试
  • WebRTC与PJSIP:呼叫中心系统技术选型指南
  • 5分钟看懂Deepseek开源周之六:Deepseek-V3/R1推理系统设计----揭开深度求索模型系统设计和运营成本之谜
  • 《HelloGitHub》第 107 期
  • 红黑树和 STL —— set和map 【复习笔记】
  • 【SpringBoot】脚手架搭建(IDEA)流程
  • 【GenBI优化】提升text2sql准确率:建议使用推理大模型,增加重试
  • mysql.gtid_executed表、gtid_executed变量、gtid_purged变量的修改时机
  • 算法-二叉树篇22-二叉搜索树的最近公共祖先
  • mysql系列10—mysql锁
  • 构建高效大数据监督的三要素
  • 数据结构(初阶)(三)----单链表
  • SAP Webide系列(7)- 优化FreeStyle新建项目预设模板