数据结构(三)树之树与树的表示

  由于在客观世界中许多事物存在层次关系,比如人类社会家谱,社会组织结构,图书信息管理等,因此研究树这种表示层级关系的结构就显得很有必要。能够使其分层次组织,在管理上具有更高效的效率。

查找

  所谓的查找就是根据某个给定关键字K,从集合R中找出关键字与K相同的记录。查找可以分为静态查找和动态查找:

  • 静态查找:集合中记录是固定的。没有插入和删除操作,只有查找。

  • 动态查找:集合中记录是动态变化的除查找,还可能发生插入和删除。

静态查找

  静态查找又可以分为顺序查找和二分查找。

  • 顺序查找
int SequentialSearch (StaticTable *Tb1, ElementType K)
{ /*在表Tbl [1]~Tbl [n]中查找关键字为K的数据元素*/
	int i;
	Tbl->Element[0] = K; /*建 立哨兵*/
	for(i = Tbl->Length; Tbl->E1ement[i] != K; i--) ;
	return i; /*查找成功返回所在单元下标;不成功返回0*/
}

  顺序查找算法的时间复杂度为O(n)O(n)

  • 二分查找Binary Search):

  二分查找有一个前提假设,即假设nn个数据元素的关键字满足有序(比如:小到大)

k1<k2<<kn\mathrm{k}_{1}<\mathrm{k}_{2}<\cdots<\mathrm{k}_{\mathrm{n}}

  并且是连续存放(数组),那么可以进行二分查找。

  举个例子:

  假设有13个数据元素,按关键字由小到大顺序存放.二分查找关健字为444的数据元素过程如下:

举例

  1. 依据left=1right=13可以算出mid = (1+13)/2 = 7,而7中的元素为100,其值小于444,因此选中右边半段。
  2. left = mid+1=8, 而right = 13不变; 计算中间值mid = (8+13)/2 = 10: 其值321小于444,再次选中右边半段。
  3. 得到left = mid+1=11, right = 13; mid = (11+13)/2 = 12: 查找结束;

  而如果所查找的元素不在数组里面会发生什么情况呢?如果不在数组里面的话,那么就会出现left > right的情况。

int BinarySearch ( StaticTable * Tbl, ElementType K)
{ /*在表Tbl中查找关键字为K的数据元素*/
	int left, right, mid, NoFound=-1;
	left= 1; /*初始左边界*/
	right = Tbl->Length; /*初始右边界*/
	while ( left <= right )
	{
	mid = (left+right)/2; 1/*计算 中间元素座标*/
	if( K < Tbl->Element[mid]) right = mid-1; /*调整右边界*/
	else if( K > Tbl->Element[mid]) left = mid+1; /*调 整左边界*/
	else return mid; /*查找成功,返回数据元素的下标*/
	}
	return NotFound; /*查找不成功,返回-1*/
}

  二分查找的算法具有对数的时间复杂度O(log2N)O(log_{2}N)

动态查找

而如果把上述过程放到一颗树里面,将其称之为判定树,可表示为如下形式:

判定树

  判定树上每个结点需要的查找次数刚好为该结点所在的层数;查找成功时查找次数不会超过判定树的深度nn个节点的判定树的深度为log2n+1log_{2}^{n}+1

  平均成功查找次数ASL= (4 x 4+4x3+2x2+1)/11 = 3。(节点的深度称上总节点数,除以节点个数)。在这种情况下是很容易对树进行删增等操作。

树的定义

  (Tree) :由n0n \geq 0个结点构成的有限集合。当n=0n=0时,称为空树;对于任一棵非空树(n>0n> 0),它具备以下性质:

  • 树中有一个称为“根(Root)”的特殊结点,用 rr 表示;
  • 其余结点可分为m(m>0)m(m>0)个互不相交的有限集T1T2TmT_{1},T_{2},\cdots,T_{m},其中每个集合本身又是一棵树,称为原来树的“子树(SubTree)”。

树

  这里要注意以下三点:

  1. 子树是不相交的;
  2. 除了根结点外,每个结点有且仅有一个父结点
  3. 一棵NN个结点的树有N1N-1条边。

  树的一些基本术语

  1. 结点的度(Degree) :结点的子树个数
  2. 树的度:树的所有结点中最大的度数
  3. 叶结点(Leaf) :度为0的结点
  4. 父结点(Parent) :有子树的结点是其子树的根结点的父结点
  5. 子结点(Child) :若AA结点是BB结点的父结点,则称BB结点是AA结点的子结点;子结点也称孩子结点
  6. 兄弟结点(Sibling) :具有同一父结点的各结点彼此是兄弟结点。
  7. 路径和路径长度:从结点nn,到nn的路径为一个结点序列n1n_{1}n2n_{2} \cdotsnkn_{k}nin_{i}ni+1n_{i+1}的父结点。路径所包含边的个数为路径的长度。
  8. 祖先结点(Ancestor):沿树根到某一结点路径上的所有结点都是这个结点的祖先结点。
  9. 子孙结点(Descendant):某一结点的子树中的所有结点是这个结点的子孙。
  10. 结点的层次(Level) :规定根结点在1层,其它任一结点的层数是其父结点的层数加1
  11. 树的深度(Depth) :树中所有结点中的最大层次是这棵树的深度。

树的表示

  通常树的表示如下图所示:

常见树的表示

  也可采用儿子-兄弟表示法:

儿子兄弟表示法

  将其旋转45度后就变成了二叉树:

二叉树表示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章