freeCodeCamp/guide/chinese/algorithms/avl-trees/index.md

52 lines
2.8 KiB
Markdown
Raw Normal View History

---
title: AVL Trees
localeTitle: AVL树
---
## AVL树
AVL树是二叉搜索树的子类型。
BST是由节点组成的数据结构。它有以下保证
1. 每棵树都有一个根节点(在顶部)。
2. 根节点具有零个或多个子节点。
3. 每个子节点都有零个或多个子节点,依此类推。
4. 每个节点最多有两个孩子。
5. 对于每个节点,其左后代小于当前节点,该节点小于正确的后代。
AVL树有额外的保证
6. 右子树和左子树深度之间的差异不能超过一。为了保持这种保证AVL的实现将包括在添加附加元素时重新平衡树的算法将扰乱该保证。
AVL树的最坏情况查找插入和删除时间为Olog n
### 右转
![AVL树右旋转](https://raw.githubusercontent.com/HebleV/valet_parking/master/images/avl_right_rotation.jpg)
### 左转
![AVL树左旋转](https://raw.githubusercontent.com/HebleV/valet_parking/master/images/avl_left_rotation.jpg)
### AVL插入过程
您将执行类似于普通二进制搜索树插入的插入。插入后使用向左或向右旋转修复AVL属性。
* 如果右子树的左子节点存在不平衡,则执行左右旋转。
* 如果左子树的左子节点存在不平衡,则执行右旋转。
* 如果右子树的右子项存在不平衡,则执行左旋转。
* 如果左子树的右子项存在不平衡,则执行左右旋转。
#### 更多信息:
[YouTube - AVL树](https://www.youtube.com/watch?v=7m94k2Qhg68)
AVL树是自平衡二叉搜索树。 AVL树是二叉搜索树具有以下属性 - >每个节点的子树的高度最多为1。 - >每个子树都是一个AVL树。
AVL树检查左侧和右侧子树的高度并确保差异不大于1.这种差异称为平衡因子。 AVL树的高度始终为OLogn其中n是树中的节点数。
AVL树轮换 -
在AVL树中在执行插入和删除等每个操作后我们需要检查树中每个节点的平衡因子。如果每个节点都满足平衡因子条件那么我们就结束操作否则我们必须使其平衡。当树由于任何操作而变得不平衡时我们使用旋转操作来使树平衡。
旋转操作用于使树平衡。有四种旋转,它们分为两种类型: - >单左旋转LL旋转 在LL旋转中每个节点从当前位置向左移动一个位置。 - >单右旋转RR旋转 在RR Rotation中每个节点从当前位置向右移动一个位置。 - >左右旋转LR旋转 LR旋转是单个左旋转然后单个右旋转的组合。在LR Rotation中首先每个节点从当前位置向左移动一个位置然后向右移动一个位置。 - >左右旋转RL旋转 RL旋转是单右旋转然后单左旋转的组合。在RL旋转中首先每个节点从当前位置向右移动一个位置然后向左移动一个位置。