数据结构之树(三)

基本概念

  树(Tree)是n(n≥0) 个结点的有限集。n=0 时称为空树。在任意一棵非空树中:
  1. 有且仅有一个特定的称为根(Root)的结点;
  2. 当n>1 时,其余结点可分为m (m>0) 个互不相交的有限集T1 、T2、……、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)

  节点,包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度(Degree) 。为0的结点称为叶结点(Leaf) 或终端结点;度不为0 的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结。树的度是树内各结点的度的最大值。
 

二叉树

  二叉树(Binary Tree)是n(n ≥ 0) 个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树就是每个结点的度≤2的树。

 

树的遍历

1.前序遍历

  对任一(子)树的前序遍历,将首先访问其根节点,然后再递归地对其下的各棵子树进行前序遍历。对于同一根节点下的各棵子树,遍历的次序通常是任意的;但若换成有序树,则可以按照兄弟间相应的次序对它们实施遍历。由前序遍历生成的节点序列,称作前序遍历序列。

2.后续遍历

  对称地,对任一(子)树的后序遍历将首先递归地对根节点下的各棵子树进行后序遍历,最后才访问根节点。由后序遍历生成的节点序列,称作后序遍历序列。

3.层次遍历

  对于同一深度的节点,访问的次序可以是随机的,通常取决于它们的存储次序,即首先访问由firstChild指定的长子,然后根据nextSibling确定后续节点的次序。当然,若是有序树,则同深度节点的访问次序将与有序树确定的次序一致。

 

二叉排序树 

  二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值

  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值

  • 它的左、右子树也分别为二叉排序树

  • 一棵普通的二叉排序树也会出现不平衡问题,如果插入的数据都在树的一侧,就会使得树的深度迅速增大,每次二分查找可以排除的数据很少,从而查询速度严重下降

 

平衡二叉树 

  平衡二叉树(Self-Balancing Binary Search Tree 或Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1 。它是一种高度平衡的二叉排序树。意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1 。我们将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF (Balance Factor),那么平衡二叉树上所有结点的平衡因子只可能是-1 、0 和1
  平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。最小不平衡子树是指距离插入结点最近的,且平衡因子的绝对值大于1 的结点为根的子树。

  
 

 红黑树

   红黑树的由来是因为二叉查找树可能退化成链表,导致时间复杂度变为O(n),而平衡二叉树维护平衡的代价开销过大。红黑树的插入与删除和AVL树类似,也是每插入一个结点,都检查是否破坏了树的结构,然后进行调整。红黑树每个结点插入时默认都为红色,这样做可以降低黑高,也可以减少调整的次数。红黑树 并不追求“完全平衡 ”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树能够以 O(log2  n)  的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。

  红黑树是JDK中TreeMap、TreeSet的底层数据结构,在JDK1.8中HashMap也用到了红黑树.

  • 每个节点或者是黑色,或者是红色。
  • 根节点是黑色。
  • 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
  • 如果一个节点是红色的,那么它的两个子节点就是黑色的(没有连续的红节点)
  • 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点

  红黑树的自我修正方式

  A. 改变节点颜色;

  B. 左旋:待旋转的节点从右边上升到父节点就是左旋;

  C. 右旋:待旋转的节点从左边上升到父节点就是右旋;



posted @ 2020-11-24 15:49  鄙人取个名字好难  阅读(149)  评论(0编辑  收藏  举报