二叉搜索平衡树
为什么要有平衡树呢?简单的说,提高搜索效率,不至于 让 二叉搜索树的 查询 变为 0(n)。
要明白 avl 树的算法,首先要明白如下定义:
- 平衡因子
 
- 左旋,右旋,LR 旋转 RL 旋转 等四种特殊的方式
 
这个算法是边构建,边调整。平衡因子是指:左子树与右子树的高度之差,如果插入某个节点后,根节点的平衡因子
等于 2,那么我们就需要进行调整,而调整 就有 如上的四种方式。也是比较好理解。
https://zhuanlan.zhihu.com/p/56066942
详解 AVL 树(基础篇) - Name1e5s 的文章 - 知乎
https://zhuanlan.zhihu.com/p/34899732
这是个非常重要的知识点,主要是设计二叉搜索平衡树的构建,要花费较少的时间。
细细研究一下。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
   |  struct AVLTreeNode {     int data, height;     AVLTreeNode* left, * right;     AVLTreeNode(int val) :data(val), left(NULL), right(NULL), height(0) {} }; int getheight(AVLTreeNode* r) {     return r == NULL ? 0 : r->height; }
 
 
 
  AVLTreeNode* leftLeftRotation(AVLTreeNode* k2) {     AVLTreeNode* k1 = k2->left;          k2->left = k1->right;
      k1->right = k2;          k2->height = max(getheight(k2->left), getheight(k2->right)) + 1;
           k1->height = max(getheight(k1->left), k2->height) + 1;     return k1; }
 
 
  AVLTreeNode* rightRightRotation(AVLTreeNode* k1) {     AVLTreeNode* k2 = k1->right;
           k1->right = k2->left;     k2->left = k1;     k1->height = max(getheight(k1->left), getheight(k1->right)) + 1;     k2->height = max(getheight(k2->right), k1->height) + 1;     return k2; }
 
  AVLTreeNode* leftRightRatation(AVLTreeNode* k3) {          k3->left = rightRightRotation(k3->left);     return leftLeftRotation(k3); }
  AVLTreeNode* rightLeftRotation(AVLTreeNode* k4) {     k4->right = leftLeftRotation(k4->right);     return rightRightRotation(k4); }
  AVLTreeNode* insertNode(AVLTreeNode* root, int data) {     if (!root)         root = new AVLTreeNode(data);     else if (data < root->data)     {                  root->left = insertNode(root->left, data);         if (getheight(root->left) - getheight(root->right) == 2)             if (data < root->left->data)                 root = leftLeftRotation(root);             else                 root = leftRightRatation(root);     }     else if (data > root->data)     {                  root->right = insertNode(root->right, data);         if (getheight(root->right) - getheight(root->left) == 2)             if (data > root->right->data)                 root = rightRightRotation(root);             else                 root = rightLeftRotation(root);     }     else         cout << "fail" << endl;          root->height = max(getheight(root->left), getheight(root->right)) + 1;     return root; } AVLTreeNode* Root=nullptr; void dfs(TreeNode* root) {     if(!root) return ;     Root=insertNode(Root,root->val);     dfs(root->left);     dfs(root->right); }
 
  void build(AVLTreeNode* Troot,TreeNode*& root) {     if(!Troot) return ;          root=new TreeNode(Troot->data);     build(Troot->left,root->left);     build(Troot->right,root->right); } class Solution { public:     TreeNode* balanceBST(TreeNode* root) {         Root=nullptr;         dfs(root);         TreeNode* ret=nullptr;         build(Root,ret);         return ret;     } };
 
 
  | 
 
https://leetcode-cn.com/problems/balance-a-binary-search-tree/comments/