二叉树:
特点:
- 每个结点最多有两棵子树。
- 左子树和右子树是有顺序的,次序不能颠倒。
- 即使某结点只有一个子树,也要区分左右子树。
性质:
- 在非空二叉树的i层上,至多有2i-1个结点(i>=1)。
- 在深度为K的二叉树上最多有2k-1个结点(k>=1)。
- 对于任何一棵非空的二叉树,如果叶结点个数为n0,度数为2的结点个数为n2,则有: n0 = n2 + 1
- 在一棵二叉树中,除了叶子结点(度为0)之外,就剩下度为2(n2)和1(n1)的结点了。树的结点总数为:T=n0+n1+n2;连线数为:T-1 故:n0+n1+n2-1 = 2*n2+n1 ==> n0 = n2+1;
满二叉树:
- 所有的分支结点都有左子树和右子树,并且所有的叶子结点都在同一层上,这样的二叉树就是满二叉树。满二叉树的关键在于树的平衡。
完全二叉树:
- 对一棵具有n个结点的二叉树按层序排号,如果编号为i的结点与同样深度的满二叉树编号为i结点在二叉树中位置完全相同,就是完全二叉树。完全二叉树的关键在于先按层序编号,然后对应查找。
二叉查找树、二叉排序树、二叉搜索树(Binary Search Tree 简称BST):
定义:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
- 左、右子树也分别为二叉排序树;
特点:
- 没有键值相等的结点。
- 二叉排序树是一个递归的数据结构。
查找:
- 二叉排序树的查找是从根结点开始,沿某一分支逐层向下进行比较的过程。
- 若二叉排序树非空,将给定值与根结点的关键字比较,如果相等,则查找成功。
- 如果根结点的关键字大于给定值,则在根结点的左子树中查找,如果根结点的关键字小于给定值,则在根结点的右子树中查找。
插入:
- 先判断要插入的值是否已经存在,若存在则不插入。
- 如果二叉排序树为空,则直接插入结点。
- 如果二叉排序树非空,当要插入的值小于根结点的关键字则插入到左子树中,当要插入的值大于根结点的关键字则插入到右子树中。
删除:
- 如果要删除的结点d是叶子结点,则直接删除。
- 如果d只有一棵左子树或右子树,则让d的子树替代d的位置,让d的子树成为d父结点的子树。
- 如果d有左右两棵子树,则让d的直接后继(或直接前驱)替代d,然后从二叉排序树中删除这个直接后继(或直接前驱)。
平衡二叉树(AVL):
名词解释:
- AVL 是大学教授 G.M. Adelson-Velsky 和 E.M. Landis 名称的缩写,他们提出的平衡二叉树的概念,为了纪念他们,将 平衡二叉树 称为 AVL树。
定义:
- 为了避免树的高度增长过快导致二叉排序树的性能下降,在插入和删除二叉树结点时,要保证任意结点的左右子树之间的高度差不超过1,我们将这样的二叉树称为平衡二叉树,简称平衡树。
- 结点的左子树和右子树的高度差为该结点的平衡因子。
特点:
- 平衡二叉树是二叉查找树的一种。
- 每个结点的左子树和右子树都是平衡二叉树。
- 每个结点的左子树和右子树之间的高度差不超过1,即每个结点的平衡因子的值只能是-1、0或1。
查找:
- 平衡二叉树的查找过程与二叉查找树的查找过程相同。
引入平衡二叉树的目的:
- 为了解决二叉查找树因不平衡而导致访问的时间复杂度大大增加的问题,避免二叉查找树退化为单链表的极端情况。
复杂度:
- 查找、插入和删除的时间复杂度最坏情况下都是O(log n)
缺点:
- 为了维持高度的平衡,插入、删除的操作相对比较耗时。
应用:
- 适合查找操作很多,但是插入与删除操作比较少的情况。
红黑树(Red-Black Tree):
定义:
- 红黑树是一种特殊的二叉查找树。
- 红黑树的每个节点上都有存储位表示节点的颜色,颜色是红或黑。
特性:
- 每个节点是黑色或红色。
- 根节点是黑色。
- 如果一个节点是红色的,则它的子节点都是黑色的。
- 一个节点到该节点的(子孙节点中)叶子节点的所有路径都包含相同数目的黑节点。
- 每个叶子节点是黑色。
- 注意:
- 这里叶子节点,是指为空(null)的叶子节点。
说明:
- 这些特性保证了红黑树的关键性质: 从根到叶子的最长路径不大于最短路径的两倍,故红黑树大致上是平衡的。
复杂度:
- 查找、插入和删除的时间复杂度最坏情况下都是为O(log2(N)),即O(log n)。
优点:
- 不追求高度的平衡,任何的不平衡都会在三次旋转之内解决。插入和删除操作的性能相比于平衡二叉树更稳定一些。
红黑树 VS 平衡二叉树
- 红黑树的查找、插入、删除操作性能都比较稳定。
- 平衡二叉树查找的性能特别好,但是插入、删除的性能相对于红黑树就差一些。
- 对于频繁进行插入、删除操作的场景,红黑树比平衡二叉树更加适合。