[算法]AVL树
来源:互联网 发布:mac桌面壁纸不能平铺 编辑:程序博客网 时间:2024/06/04 19:27
#include <iostream>using namespace std;struct TreeNode { int key; int height{0}; TreeNode* left, * right; TreeNode(int tKey = 0, TreeNode* tLeft = nullptr, TreeNode* tRight = nullptr) { key = tKey; left = tLeft; right = tRight; }};class AVLTree {private: TreeNode* root; TreeNode* insertNodeImpl(int key, TreeNode* root) { if (!root) { root = new TreeNode(key); } else { if (key < root->key) { root->left = insertNodeImpl(key, root->left); root = fixUpWhenInsertingIntoLeft(key, root); } else { root->right = insertNodeImpl(key, root->right); root = fixUpWhenInsertingIntoRight(key, root); } } updateHeight(root); return root; } int height(TreeNode* root) { if (!root) { return 0; } else { return root->height; } } void updateHeight(TreeNode* root) { root->height = max(height(root->left), height(root->right)) + 1; } TreeNode* fixUpWhenInsertingIntoLeft(int key, TreeNode* root) { if (height(root->left) - height(root->right) >= 2) { if (key < root->left->key) { root = singleRotateWithLeft(root); } else { root = doubleRotateWithLeft(root); } } return root; } TreeNode* fixUpWhenInsertingIntoRight(int key, TreeNode* root) { if (height(root->right) - height(root->left) >= 2) { if (key > root->right->key) { root = singleRotateWithRight(root); } else { root = doubleRotateWithRight(root); } } return root; } TreeNode* singleRotateWithLeft(TreeNode* root) { TreeNode* newRoot = root->left; root->left = newRoot->right; newRoot->right = root; updateHeight(root); updateHeight(newRoot); return newRoot; } TreeNode* singleRotateWithRight(TreeNode* root) { TreeNode* newRoot = root->right; root->right = newRoot->left; newRoot->left = root; updateHeight(root); updateHeight(newRoot); return newRoot; } TreeNode* doubleRotateWithLeft(TreeNode* root) { root->left = singleRotateWithRight(root->left); return singleRotateWithLeft(root); } TreeNode* doubleRotateWithRight(TreeNode* root) { root->right = singleRotateWithLeft(root->right); return singleRotateWithRight(root); } void traversalImpl(TreeNode* root) { if (root) { cout << root->key << " "; traversalImpl(root->left); traversalImpl(root->right); } } TreeNode* deleteNodeImpl(int key, TreeNode* root) { if (!root) { return root; } if (key == root->key) { if (!root->right) { TreeNode* newRoot = root->left; delete root; return newRoot; } else { int min = findMin(root->right); root->key = min; root->right = deleteNodeImpl(min, root->right); } } else if (key > root->key) { root->right = deleteNodeImpl(key, root->right); } else { root->left = deleteNodeImpl(key, root->left); } updateHeight(root); root = deleteFixUp(root); return root; } int findMin(TreeNode* root) { while (root->left) { root = root->left; } return root->key; } TreeNode* deleteFixUp(TreeNode* root) { if (height(root->left) - height(root->right) >= 2) { if (height(root->left->left) > height(root->left->right)) { root = singleRotateWithLeft(root); } else { root = doubleRotateWithLeft(root); } } else if (height(root->right) - height(root->left) >= 2) { if (height(root->right->right) > height(root->right->left)) { root = singleRotateWithRight(root); } else { root = doubleRotateWithRight(root); } } return root; }public: AVLTree() { root = nullptr; } void insertNode(int key) { root = insertNodeImpl(key, root); } void deleteNode(int key) { root = deleteNodeImpl(key, root); updateHeight(root); root = deleteFixUp(root); } void traversal() { traversalImpl(root); cout << endl; }};int main() { AVLTree tree; for (int i = 0; i < 4; i += 1) { tree.insertNode(i); } tree.insertNode(19); tree.traversal(); tree.deleteNode(15); tree.traversal(); return 0;}
0 0
- AVL树插入算法
- [算法]AVL树
- 算法之AVL树
- AVL树常用算法算法
- 算法-AVL树的插入
- 算法--AVL树的删除
- AVL树(算法导论)
- 经典查找算法 -AVL树
- AVL树的插入算法
- AVL算法
- 【数据结构与算法基础】AVL树 / AVL Tree
- 数据结构与算法10: 平衡二叉树AVL(AVL Tree)
- 算法二叉搜索树之AVL树
- AVL树删除算法 (使用树高)
- 算法导论-13-3-AVL树
- 算法导论-AVL树的C++实现
- AVL树的算法思路整理
- AVL树删除算法的实现
- JavaWeb学习笔记-JDBC操作(2)[数据库的更新与查询]
- Linux:awk命令详解
- Cover王锐大大——最长的一帧(第二日)
- 【微信小程序】No.1 注册属于你自己的微信小程序帐号
- centos7怎么连接网络
- [算法]AVL树
- MFC自绘按钮的实现(不断更新)
- 关于手机线刷的个人点滴心得分享 (新手线刷指南)
- 小程序发布后最全解析!
- JavaScript使用接口
- 9、斐波那契数列
- 剑指offer——第一次只出现一次的字符
- Spring MVC整合 freemarker教程
- 《MySql》--百万级数据优化查询