树的预备知识,基本术语,顺序查找(哨兵)和二分查找


客观世界中许多食物存在层次关系:人类社会家谱、社会组织结构、文件路径
分层次组织在管理上具有更高的效率
查找:静态查找:集合中的记录是固定不变的
哨兵,第一个字符放长度,在第零号位置存放我们要查找的字符,从后往前查找
动态查找:集合中的记录是动态变化的
静态查找
方法一:顺序查找:(哨兵)

1 typedef struct LNode *List;
2 strut LNode {
3 ElementType Element[MAXSIZE];
4 int length;
5 };
1 //查找的函数实现
2 int SequentialSearch(List Tb1, ElementType K)
3 {//在Element[1]~Element[n]中查找关键字为K的数据元素
4 int i;
5 Tb1->Element[0] = K; /*建立哨兵**/
6 for(i= Tb1->length; Tb1->Element[i] != K; i--);
7 return i;    //查找成功返回所在单元下标;不成功返回0
8 }

方法二、二分查找(Binary Search)
假设n个数据元素的关键字满足有序且是连续存放(在数组中),那么可以进行二分查找
在链表中则不能二分查找,无序也不能二分查找
left mid right
当right > left 时,查找失败
二分查找判定树:判定树上每个结点需要的查找次数刚好为该结点所在的层数
查找成功时不会超过判定树的深度
n个结点的判定树的深度为[log2n]+1

数的定义: n(n>=0)个结点构成的有限集合
n = 0 时为空树
根r(root)
字树:字树之间是不想交的,
除根节点外,每个结点有且仅有一个父节点
一棵N个结点的数有N-1条边
数是保证结点连通的边最少的一种连接方式


树的一些基本概念:
结点的度:(degree)结点的字树个数
树的度:
叶节点 (Leaf ):度为0的结点,没有字树的结点
父结点:(parent)有字树的结点是其字树的根节点的父节点
子节点:(child):
兄弟结点( (Sibling ):具有同一父节点的各结点彼此是兄弟结点
路径和路径长度:从结点n 1 到 到n k 的 路径 为一个结点序列n 1 , n 2 ,… , n k , n i 是 是 n i+1 的父结
点。路径上边的条数就是路径长度

祖先结点(Ancestor) :沿树根到某一节点路径上的所有结点都是这个结点的祖先结点
子孙结点(Descendant) :某一节点的子树中所有结点是这个结点的子孙
结点的层次 (Level ):规定根结点在1层,其他任意结点的层数是其父节点的层数加一
树的深度( (Depth):树中所有结点中的最大层次是这棵树的深度
任意结点的深度:从根结点到该结点的唯一路径的长度(所以根节点的深度为0)
结点的高:从该结点到一片树叶的最长路径的长(所以树叶的高为0)
后裔:
真后裔:
ASL = (4*4 + 4*3 + 2*2 +1) = 3 //平均成功查找次数

二分查找代码:

 1 int BinarySearch(StaTalbe *Tbl, ElementType K)
 2 {//在表TB了中查找关键字为K的数据元素
 3 int left, right, mid, NotFound = -1;
 4 left = 1;    //初始左边界
 5 right = Tbl->length;    //初始右边界
 6 while(left <= right)
 7 {
 8 mid = (left + right) / 2;    //计算中间元素坐标
 9 if(K < Tbl->element[mid]) right = mid - 1;    //调整有边界
10 else if(K > Tbl->element[mid] left = mid +1;    //调整做边界
11 else    return mid;    //查找成功,返回数据元素的下标
12 }
13 return NotFound;    //查找不成功,返回-1;
14 }

数的定义: n(n>=0)个结点构成的有限集合
n = 0 时为空树
根r(root)
字树:字树之间是不想交的,
除根节点外,每个结点有且仅有一个父节点
一棵N个结点的数有N-1条边
数是保证结点连通的边最少的一种连接方式


树的一些基本概念:
结点的度:(degree)结点的字树个数
树的度:
叶节点 (Leaf ):度为0的结点,没有字树的结点
父结点:(parent)有字树的结点是其字树的根节点的父节点
子节点:(child):
兄弟结点( (Sibling ):具有同一父节点的各结点彼此是兄弟结点
路径和路径长度:从结点n 1 到 到n k 的 路径 为一个结点序列n 1 , n 2 ,… , n k , n i 是 是 n i+1 的父结点。路径上边的条数就是路径长度

祖先结点(Ancestor) :沿树根到某一节点路径上的所有结点都是这个结点的祖先结点

子孙结点(Descendant) :某一节点的子树中所有结点是这个结点的子孙
结点的层次 (Level ):规定根结点在1层,其他任意结点的层数是其父节点的层数加一
树的深度( (Depth):树中所有结点中的最大层次是这棵树的深度
任意结点的深度:从根结点到该结点的唯一路径的长度(所以根节点的深度为0)
结点的高:从该结点到一片树叶的最长路径的长(所以树叶的高为0)
后裔:
真后裔:

原文地址:https://www.cnblogs.com/hi3254014978/p/9504736.html