当前位置: 首页 > 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;
}
```

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

相关文章:

  • 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推理系统设计----揭开深度求索模型系统设计和运营成本之谜
  • 做视频网站玩什么配置/互联网营销案例分析
  • 网站建设服务商排行/免费发布广告信息平台
  • 医疗知识普及网站开发/网络推广公司是干嘛的
  • 网站制作 公司资质/搜索引擎营销名词解释
  • 免费空白ppt模板下载/宁波seo链接优化
  • 厦门市建设局官方网站证书查询/网络营销的四大要素