二叉树:
二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树
完全二叉树:
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为 i 的结点与满二叉树中编号为 i 的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树
满二叉树:
在二叉树的基础上,满二叉树满足:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树
二叉查找树(二叉搜索树、二叉排序树)
二叉查找树的定义如下:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值
- 若右子树不空,则右子树上所有结点的值均大于它的根结点的值
- 左、右子树也分别为二叉排序树
- 没有键值相等的结点
需要注意的一点是,二叉查找树中序遍历结果满足从小到大排序的规则
平衡二叉树(AVL):
在二叉搜索树的基础上,满足左右子树高度差不超过 1
数的高度越低,需要遍历的次数越少,整体查询效率越高。所以一般情况下平衡二叉树的查找效率高于二叉搜索数
平衡二叉树由于强维护平衡逻辑,更适合查询多的场景,如果频繁的添加或删除元素需要多次旋转维持平衡,整体效率会很差
红黑树:
红黑树是平衡二叉查找树的变体,它的左右子树高度差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但对之进行平衡的代价较低, 其平均统计性能要强于 AVL。红黑树的定义如下:
- 每个节点非红即黑
- 根节点是黑的
- 所有叶子都是黑色(叶子是 NIL 结点)
- 如果一个节点是红的,那么它的两个叶节点都是黑的
- 对于任意结点而言,其到叶结点树尾端 NIL 指针的每条路径都包含相同数目的黑结点
正是红黑树的这5条性质,使一棵 n 个结点的红黑树始终保持了 logn 的高度,从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为 O(log n)