mirror of
https://github.com/oxyanyano/2022-WangDao-CS-DS-Notes.git
synced 2026-02-02 18:29:00 +08:00
47 lines
1.7 KiB
Markdown
47 lines
1.7 KiB
Markdown
## 平衡二叉树——Balanced Binary Tree
|
||
|
||
### 一、平衡二叉树的定义
|
||
|
||
`平衡二叉树`,又被称为`AVL树`(有别于AVL算法),且具有以下性质:
|
||
|
||
它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
|
||
|
||
AVL是两个人的名字,ASL是平均查找长度,不一样
|
||
|
||
`结点的平衡因子=左子树高-右子树高`
|
||
|
||
平衡二叉树结点的平衡因子的值只可能是-1、0、1。
|
||
|
||

|
||
|
||
### 二、平衡二叉树的存储结构(用链式存储)
|
||
|
||
平衡二叉树的类型表述(与二叉树不一样)
|
||
|
||
```c
|
||
typedef struct AVLNode{
|
||
int key; //数据域
|
||
int balance; //平衡因子
|
||
struct AVLNode *lchide, *rchild; //左、右孩子指针
|
||
}AVLNode, *AVLTree;
|
||
```
|
||
|
||
### 三、平衡二叉树的插入
|
||
|
||
在平衡的二叉排序树中插入一个结点导致不平衡,如何调整平衡?
|
||
解决方法:调整`“最小不平衡树”`
|
||
|
||
四种调整方法:
|
||
①LL:在A的`左孩子的左子树`中插入导致A的不平衡,将A的`左孩子右上旋`。
|
||
②RR:在A的`右孩子的右子树`中插入导致A的不平衡,将A的`右孩子左上旋`。
|
||
③LR:在A的`左孩子的右子树`中插入导致A的不平衡,将A的`左孩子的右孩子,先左上旋再右上旋`。
|
||
④RL:在A的`右孩子的左子树`中插入导致A的不平衡,将A的`右孩子的左孩子,先右上旋再左上旋`。
|
||
|
||
### 四、查找效率分析
|
||
|
||
`平均查找的时间复杂度`=O(log~2~h)
|
||
|
||
### 五、高度为h的平衡二叉树的最少结点数
|
||
|
||
`递推公式`:$$n_h=n_{h-1}+n_{h-2}+1$$
|