数据结构之树(三)
基本概念
1. 有且仅有一个特定的称为根(Root)的结点;
2. 当n>1 时,其余结点可分为m (m>0) 个互不相交的有限集T1 、T2、……、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
二叉树
二叉树(Binary Tree)是n(n ≥ 0) 个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树就是每个结点的度≤2的树。
树的遍历
1.前序遍历
对任一(子)树的前序遍历,将首先访问其根节点,然后再递归地对其下的各棵子树进行前序遍历。对于同一根节点下的各棵子树,遍历的次序通常是任意的;但若换成有序树,则可以按照兄弟间相应的次序对它们实施遍历。由前序遍历生成的节点序列,称作前序遍历序列。
2.后续遍历
对称地,对任一(子)树的后序遍历将首先递归地对根节点下的各棵子树进行后序遍历,最后才访问根节点。由后序遍历生成的节点序列,称作后序遍历序列。
3.层次遍历
二叉排序树
二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:
-
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
-
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
-
它的左、右子树也分别为二叉排序树
- 一棵普通的二叉排序树也会出现不平衡问题,如果插入的数据都在树的一侧,就会使得树的深度迅速增大,每次二分查找可以排除的数据很少,从而查询速度严重下降
平衡二叉树
红黑树
红黑树的由来是因为二叉查找树可能退化成链表,导致时间复杂度变为O(n),而平衡二叉树维护平衡的代价开销过大。红黑树的插入与删除和AVL树类似,也是每插入一个结点,都检查是否破坏了树的结构,然后进行调整。红黑树每个结点插入时默认都为红色,这样做可以降低黑高,也可以减少调整的次数。红黑树 并不追求“完全平衡 ”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树能够以 O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。
红黑树是JDK中TreeMap、TreeSet的底层数据结构,在JDK1.8中HashMap也用到了红黑树.
- 每个节点或者是黑色,或者是红色。
- 根节点是黑色。
- 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
- 如果一个节点是红色的,那么它的两个子节点就是黑色的(没有连续的红节点)
- 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
红黑树的自我修正方式
A. 改变节点颜色;
B. 左旋:待旋转的节点从右边上升到父节点就是左旋;
C. 右旋:待旋转的节点从左边上升到父节点就是右旋;