zoukankan      html  css  js  c++  java
  • 平衡二叉树

    平衡二叉树(AVL)是一种特殊的二叉搜索树,他满足两个性质:

    1. 此树是二叉搜索树

    2. 任意节点的左右子树高度差的绝对值不超过1

    这样是为了提高查询的效率,因为一般的二叉搜索树有可能不会是完全二叉树或者接近完全二叉树情况,有的甚至退化成链表,所以平衡二叉树将二叉树平衡一下,使得查询效率满足logn,主要有四种情况,一种是LL型,RR型,LR型,RL型,具体见代码实现:

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <stdlib.h>
      4 using namespace std;
      5 typedef struct AVLTree{
      6     int data;
      7     struct AVLTree *lchild, *rchild;
      8     int height;
      9 }AVLTree, *PAVLTree;
     10 int getHeight(PAVLTree T)
     11 {
     12     int height = 0;
     13     if (T != NULL)
     14     {
     15         height = 1;
     16         if (T->lchild != NULL)
     17             height = T->lchild->height + 1;
     18         if (T->rchild != NULL)
     19             height = max(height, T->rchild->height) + 1;
     20     }
     21     return height;
     22     //recursion version
     23 //    if (T != NULL)
     24 //        return max(getHeight(T->lchild), getHeight(T->rchild)) + 1;
     25 //    else
     26 //        return 0;
     27 }
     28 //LL type
     29 PAVLTree SingleLeft(PAVLTree A)
     30 {
     31     PAVLTree B = A->lchild;
     32     A->lchild = B->rchild;
     33     B->rchild = A;
     34     A->height = max(getHeight(A->lchild), getHeight(A->rchild)) + 1;
     35     B->height = max(getHeight(B->lchild), getHeight(B->rchild)) + 1;
     36     return B;
     37 }
     38 //RR type
     39 PAVLTree SingleRight(PAVLTree A)
     40 {
     41     PAVLTree B = A->rchild;
     42     A->rchild = B->lchild;
     43     B->lchild = A;
     44     //update height
     45     A->height = max(getHeight(A->lchild), getHeight(A->rchild));
     46     B->height = max(getHeight(B->lchild), getHeight(B->rchild));
     47     return B;
     48 }
     49 //LR type
     50 PAVLTree Double_Left_Right(PAVLTree A)
     51 {
     52     A->lchild = SingleRight(A->lchild);
     53     return SingleLeft(A);
     54 }
     55 //RL type
     56 PAVLTree Double_Right_Left(PAVLTree A)
     57 {
     58     A->rchild = SingleLeft(A->rchild);
     59     return SingleRight(A);
     60 }
     61 //insert function
     62 PAVLTree insert_AVL_tree(int data, PAVLTree T)
     63 {
     64     //the process same as binary search tree, but keep balance of the tree after inserted data
     65     if (T == NULL)
     66     {
     67         T = (PAVLTree)malloc(sizeof(AVLTree));
     68         T->data = data;
     69         T->lchild = T->rchild = NULL;
     70         T->height = 0;
     71     }
     72     if (data < T->data)
     73     {
     74         T->lchild = insert_AVL_tree(data, T->lchild);
     75         //if can not meeting the conditions
     76         if (getHeight(T->lchild) - getHeight(T->rchild) == 2)
     77         {
     78             if (data < T->lchild->data)
     79             {
     80                 T = SingleLeft(T);
     81             }
     82             else
     83                 T = Double_Left_Right(T);
     84         }
     85     }
     86     //if can not meeting the conditions
     87     else if (data > T->data)
     88     {
     89         T->rchild = insert_AVL_tree(data, T->rchild);
     90         if (getHeight(T->lchild) - getHeight(T->rchild) == -2)
     91         {
     92             if (data > T->rchild->data)
     93                 T = SingleRight(T);
     94             else
     95                 T = Double_Right_Left(T);
     96         }
     97     }
     98     //update the height
     99     T->height = max(getHeight(T->lchild), getHeight(T->rchild)) + 1;
    100 
    101     return T;
    102 
    103 
    104 }
    105 //previous order traverse
    106 void preOrderTraverse(PAVLTree T)
    107 {
    108     if (T != NULL)
    109     {
    110         cout << T->data << " ";
    111         preOrderTraverse(T->lchild);
    112         preOrderTraverse(T->rchild);
    113     }
    114 }
    115 int main()
    116 {
    117     int n;
    118     cin >> n;//the number of test data
    119     int t;
    120     PAVLTree root = NULL;
    121     for (int i = 0; i < n; i++)
    122     {
    123         cin >> t;
    124         root = insert_AVL_tree(t, root);//create the AVL tree
    125     }
    126     preOrderTraverse(root);//show the result
    127     return 0;
    128 }
  • 相关阅读:
    联合主键SQL 联合索引
    SQL 对decimal类型转换为int类型
    SQL获取当前时间月份为两位数
    SQL 对结果集进行分组排序过滤重复数据 ROW_NUMBER
    SQL自动流水号函数
    SQL 索引创建
    .Net三层架构
    2016年你应该学习的语言和框架(转)
    MongoDB学习笔记(转)
    干货分享:让你分分钟学会 javascript 闭包(转)
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/4111181.html
Copyright © 2011-2022 走看看