1 二叉搜索树
二叉搜索树(BST)大多数人都知道,是保证左子树的所有节点都小于当前节点并且右子树的所有节点都大于当前节点。以 1 2 3 5 7 9 10 这七个节点为例,如下图所示:
例如当我们需要查找节点值为3的时候,先跟7比较,然后跟5比较,然后跟2比较,最后找到节点值为3的节点。可以看到我们的搜索时间复杂度只跟当前树的深度有关。
如果二叉树是平衡的,则当一个树的节点数有n个的时候,该树的深度是log N,所以二叉搜索树的平均时间复杂度是 O(log N)。
如果二叉树不是平衡的,如下图所示的时候,则时间复杂度会退化成O(n)
2 平衡二叉树
- 平衡因子的定义:左子树和右子树的高度差 左子树高度 - 右子树高度
- avl中要求平衡因子的绝对值小于等于1,即 平衡因子为1 或 0 或 -1
因此可以保证平衡二叉搜索树的时间复杂度会保持在O(log N)
左旋:
当平衡因子小于-1时,也就是右子树的高度比左子树的高度大于1时,需要进行左旋将其转换为平衡二叉树。例如当插入新节点 10 的时候,以4为根节点的二叉树则不满足平衡二叉树条件
左旋的步骤:
- 选中当前的根节点,将其绕着自己的右孩子(节点6)节点逆时针下压
- 将下压后的该根节点(节点4)成为自己右孩子(节点6)的左孩子
- 此时根节点(节点4)的右孩子为空,将原本右孩子(节点6)的左孩子(节点5)当作自己的右孩子
此时原本不平衡的二叉树被调整为平衡,关键点 : 左旋以右孩子为轴逆时针下压
右旋
当平衡因子大于1时,也就是左子树的高度比右子树的高度大于1时,需要进行右旋将其转换为平衡二叉树。例如当插入新节点1 的时候,以6为根节点的二叉树则不满足平衡二叉树条件
右旋的步骤:
- 选中当前的根节点,将其绕着自己的左孩子(节点4)节点顺时针下压
- 将下压后的该根节点(节点6)成为自己左孩子(节点4)的右孩子
- 此时根节点(节点6)的左孩子为空,将原本左孩子(节点4)的右孩子(节点5)当作自己的左孩子
此时原本不平衡的二叉树被调整为平衡,关键点 : 右旋以左孩子为轴顺时针下压