由于在客观世界中许多事物存在层次关系,比如人类社会家谱,社会组织结构,图书信息管理等,因此研究树这种表示层级关系的结构就显得很有必要。能够使其分层次组织,在管理上具有更高效的效率。
查找
所谓的查找就是根据某个给定关键字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*/
}
顺序查找算法的时间复杂度为。
- 二分查找(
Binary Search
):
二分查找有一个前提假设,即假设个数据元素的关键字满足有序(比如:小到大)
并且是连续存放(数组),那么可以进行二分查找。
举个例子:
假设有13
个数据元素,按关键字由小到大顺序存放.二分查找关健字为444
的数据元素过程如下:
- 依据
left=1
和right=13
可以算出mid = (1+13)/2 = 7
,而7
中的元素为100
,其值小于444
,因此选中右边半段。 - 则
left = mid+1=8
, 而right = 13
不变; 计算中间值mid = (8+13)/2 = 10
: 其值321
小于444
,再次选中右边半段。 - 得到
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*/
}
二分查找的算法具有对数的时间复杂度。
动态查找
而如果把上述过程放到一颗树里面,将其称之为判定树,可表示为如下形式:
判定树上每个结点需要的查找次数刚好为该结点所在的层数;查找成功时查找次数不会超过判定树的深度。个节点的判定树的深度为。
平均成功查找次数ASL
= (4 x 4+4x3+2x2+1)/11 = 3。(节点的深度称上总节点数,除以节点个数)。在这种情况下是很容易对树进行删增等操作。
树
树的定义
树(Tree
) :由个结点构成的有限集合。当时,称为空树;对于任一棵非空树(),它具备以下性质:
- 树中有一个称为“根(
Root
)”的特殊结点,用 表示; - 其余结点可分为个互不相交的有限集,其中每个集合本身又是一棵树,称为原来树的“子树(
SubTree
)”。
这里要注意以下三点:
- 子树是不相交的;
- 除了根结点外,每个结点有且仅有一个父结点;
- 一棵个结点的树有条边。
树的一些基本术语
- 结点的度(
Degree
) :结点的子树个数。 - 树的度:树的所有结点中最大的度数
- 叶结点(
Leaf
) :度为0的结点 - 父结点(
Parent
) :有子树的结点是其子树的根结点的父结点 - 子结点(
Child
) :若结点是结点的父结点,则称结点是结点的子结点;子结点也称孩子结点。 - 兄弟结点(
Sibling
) :具有同一父结点的各结点彼此是兄弟结点。 - 路径和路径长度:从结点,到的路径为一个结点序列, ,,是的父结点。路径所包含边的个数为路径的长度。
- 祖先结点(
Ancestor
):沿树根到某一结点路径上的所有结点都是这个结点的祖先结点。 - 子孙结点(
Descendant
):某一结点的子树中的所有结点是这个结点的子孙。 - 结点的层次(
Level
) :规定根结点在1
层,其它任一结点的层数是其父结点的层数加1
。 - 树的深度(
Depth
) :树中所有结点中的最大层次是这棵树的深度。
树的表示
通常树的表示如下图所示:
也可采用儿子-兄弟表示法:
将其旋转45度后就变成了二叉树: