zoukankan      html  css  js  c++  java
  • [小明学算法]8.二叉平衡树

    参考:http://www.cppblog.com/cxiaojia/archive/2014/03/02/187776.html

      1 #include<iostream>
      2 using namespace std;
      3 
      4 template<class T>
      5 class BTreeNode
      6 {
      7 public:
      8     //
      9     T Data;
     10     //高度
     11     int Height;
     12     //左右节点
     13     BTreeNode* Left;
     14     BTreeNode* Right;
     15 };
     16 
     17 template<class T>
     18 class BTree
     19 {
     20 
     21 public:
     22     //构造
     23     BTree() :Root(NULL){};
     24     //插入
     25     void Insert(BTreeNode<T>* &node, T data);
     26     //查找
     27     void Search(T data);
     28     //删除
     29     //TODO
     30     //中序遍历
     31     void Show(BTreeNode<T> *node);
     32     void Show1(BTreeNode<T> *node);
     33     //根节点
     34     BTreeNode<T>* Root;
     35 private:
     36 
     37     //左旋
     38     BTreeNode<T>* RotateLeft(BTreeNode<T>* node);
     39     BTreeNode<T>* DoubleRotateLeft(BTreeNode<T>* node);
     40     //右旋
     41     BTreeNode<T>* RotateRight(BTreeNode<T>* node);
     42     BTreeNode<T>* DoubleRotateRight(BTreeNode<T>* node);
     43     //高度
     44     int GetHeight(BTreeNode<T>* node);
     45     //大值
     46     int Max(int a, int b)
     47     {
     48         return a > b ? a : b;
     49     }
     50 };
     51 template<class T>
     52 void BTree<T>::Show(BTreeNode<T> *node)
     53 {
     54     if (node == NULL)
     55         return;
     56     
     57     printf("Data:%d Height:%d
    ", node->Data, node->Height);
     58     Show(node->Left);
     59     Show(node->Right);
     60 }
     61 template<class T>
     62 void BTree<T>::Show1(BTreeNode<T> *node)
     63 {
     64     if (node == NULL)
     65         return;
     66     Show1(node->Left);
     67     printf("Data:%d Height:%d
    ", node->Data, node->Height);
     68     
     69     Show1(node->Right);
     70 }
     71 
     72 template<class T>
     73 void BTree<T>::Insert(BTreeNode<T>* &node, T data)
     74 {
     75     
     76     if (node == NULL)
     77     {
     78         node = new BTreeNode<T>();
     79         node->Data = data;
     80         node->Height = 1;
     81         return ;
     82         
     83     }
     84 
     85     //如果已经插入过了
     86     if (node->Data == data)
     87     {
     88         return;
     89     }
     90 
     91     if (node->Data > data)
     92     {
     93         //插入到左侧了
     94         Insert(node->Left, data);
     95         if (GetHeight(node->Left) - GetHeight(node->Right) > 1)
     96         {
     97             //左侧的左侧 即LL
     98             if (data < node->Left->Data)
     99                 node = RotateRight(node);
    100             else// 左侧的右侧 LR
    101                 node = DoubleRotateRight(node);
    102         }
    103     }
    104 
    105     if (node->Data < data)
    106     {
    107         Insert(node->Right, data);
    108         //插入后,若右侧不平衡了
    109         if (GetHeight(node->Right) - GetHeight(node->Left)>1)
    110         {
    111             //RR
    112             if (data > node->Right->Data)
    113                 node = RotateLeft(node);
    114             else
    115                 node = DoubleRotateLeft(node);
    116         }
    117     }
    118     if (node->Left!=NULL)
    119     node->Left->Height = Max(GetHeight(node->Left->Left), GetHeight(node->Left->Right)) + 1;
    120     if (node->Right != NULL)
    121     node->Right->Height = Max(GetHeight(node->Right->Left), GetHeight(node->Right->Right)) + 1;
    122     node->Height = Max(GetHeight(node->Left), GetHeight(node->Right))+1;
    123 }
    124 
    125 template<class T>
    126 int BTree<T>::GetHeight(BTreeNode<T>* node)
    127 {
    128     if (node != NULL)
    129         return node->Height;
    130 
    131     return 0;
    132 }
    133 
    134 template<class T>
    135 BTreeNode<T>* BTree<T>::RotateLeft(BTreeNode<T>* node)
    136 {
    137     BTreeNode<T>* rightChild = node->Right;
    138     if (rightChild != NULL)
    139     node->Right = rightChild->Left;
    140     rightChild->Left = node;
    141 
    142     return rightChild;
    143 }
    144 
    145 template<class T>
    146 BTreeNode<T>* BTree<T>::DoubleRotateLeft(BTreeNode<T>* node)
    147 {
    148     //先右旋子节点
    149     return RotateLeft(RotateRight(node->Right));
    150 }
    151 
    152 template<class T>
    153 BTreeNode<T>* BTree<T>::RotateRight(BTreeNode<T>* node)
    154 {
    155     BTreeNode<T>* leftChild = node->Left;
    156 
    157     if (leftChild!=NULL)
    158     node->Left = leftChild->Right;
    159     leftChild->Right = node;
    160 
    161     return leftChild;
    162 }
    163 
    164 template<class T>
    165 BTreeNode<T>* BTree<T>::DoubleRotateRight(BTreeNode<T>* node)
    166 {    
    167     return RotateRight(RotateLeft(node->Left));
    168 }
    169 
    170 
    171 
    172 void main()
    173 {
    174     BTree<int> tree;
    175     for (int i = 0; i < 13; i++)
    176     {
    177         tree.Insert(tree.Root, rand()%100);
    178     }
    179 
    180     tree.Show(tree.Root);
    181 
    182     int a;
    183     cin >> a;
    184 }
    View Code
  • 相关阅读:
    再见OI,AFO
    时间复杂度
    NOIP真题:矩阵取数问题
    [USACO12FEB]附近的牛Nearby Cows
    合唱队
    子串
    ZJOI2010基站选址
    分治FFT学习笔记
    「HAOI2018」染色
    「SDOI2015」序列统计
  • 原文地址:https://www.cnblogs.com/WongSiuming/p/5132899.html
Copyright © 2011-2022 走看看