• 平衡二叉树


    我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定。但是,在某些极端的情况下(如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,由于在删除时,我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,提高它的操作的时间复杂度

    平衡二叉搜索树(Balanced Binary Tree):它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。常用算法有红黑树、AVL、Treap、伸展树等。在平衡二叉搜索树中,我们可以看到,其高度一般都良好地维持在O(log(n)),大大降低了操作的时间复杂度。

    红黑树,它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。

    AVL是最先发明的自平衡二叉查找树算法。在AVL中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树,n个结点的AVL树最大深度约1.44log2n。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

    如何判断一棵树平衡二叉树?

     1 判断是否是平衡二叉树
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 typedef struct node {
     5     struct node *lchild, *rchild;
     6     char data;
     7 }BiTNode, *BiTree;
     8 typedef struct {
     9     BiTree pNode;
    10     int flag;
    11 }StackNode;
    12 void Create(BiTree *T) {
    13     char ch;
    14     scanf("%c", &ch);
    15     if (ch == '#')
    16         *T = NULL;
    17     else {
    18         *T = (BiTree)malloc(sizeof(BiTNode));
    19         if (*T == NULL) exit(-1);
    20         (*T)->data = ch;
    21         Create(&((*T)->lchild));
    22         Create(&((*T)->rchild));
    23     }
    24 }
    25 /*算法流程
    26 递归计算二叉树的深度的时间复杂度是O(n) 
    27 先写出计算计算二叉树深度的代码。
    28 后序遍历每个结点,判断左右深度的关系
    29 设置全局变量标志位。
    30 */ 
    31 /*判断二叉树是否是平衡树*/
    32 int Depth(BiTree T,bool *status,bool *flag) {
    33     if(T == NULL)
    34     return 0;
    35     int left = Depth(T->lchild,status,flag);
    36     int right = Depth(T->rchild,status,flag);
    37     if(left -  right > 1 || left - right < -1) {
    38         *status = false;//某个结点不是平衡树,记录下来 
    39         if(*status == false)//可以用全局变量数组记录,然后遍历数组 
    40         *flag = false;//有false成员就不是平衡树。但可以用一个变量记录, 
    41     }//但是由于要遍历所有结点,会覆盖status,所有又加一个全局变量flag. 
    42     return left > right ? left + 1 : right + 1;
    43 }
    44 bool IsPingHeng(BiTree T) {
    45     if(T == NULL)
    46     return true;
    47     bool status = true;
    48     bool flag = true;
    49     Depth(T,&status,&flag);
    50     return flag ? true : false;
    51 }
    52 int main() {
    53     BiTree T;
    54     Create(&T);
    55     bool haha,hehe;
    56     bool status;
    57     status = IsPingHeng(T);
    58     if(status) 
    59     printf("平衡树
    ");
    60     else
    61     printf("不是平衡树
    ");
    62     printf("二叉树的深度是: %d
    ",Depth(T,&haha,&hehe));
    63     return 0;
    64 }
  • 相关阅读:
    厕所惊魂
    感谢协助学生返校,邀请交警合影留念
    小丑杀人
    东芝Toshiba e-STUDIO打印身份证
    JavaScript
    html
    pymysql模块
    线程
    队列与进程池
    网络编程
  • 原文地址:https://www.cnblogs.com/joyeehe/p/7941582.html
Copyright © 2020-2023  润新知