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

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

客观世界中许多食物存在层次关系:人类社会家谱、社会组织结构、文件路径

分层次组织在管理上具有更高的效率

查找:静态查找:集合中的记录是固定不变的

哨兵,第一个字符放长度,在第零号位置存放我们要查找的字符,从后往前查找

动态查找:集合中的记录是动态变化的

静态查找

方法一:顺序查找:(哨兵)

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)

后裔:

真后裔:

相关文章
|
6月前
|
算法
落叶归根:递归思想在二叉树叶子节点类问题中的妙用
落叶归根:递归思想在二叉树叶子节点类问题中的妙用
70 1
|
6月前
|
算法 程序员 测试技术
【数据结构-二叉树 九】【树的子结构】:树的子结构
【数据结构-二叉树 九】【树的子结构】:树的子结构
79 0
|
6月前
|
存储 人工智能 算法
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
410 0
|
5月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
52 0
|
存储 缓存 算法
Java数据结构第四讲-树/递归/Hash
Java数据结构第四讲-树/递归/Hash
|
存储 算法
【查找算法】二叉排序树查找法
【查找算法】二叉排序树查找法
二叉树习题系列1--将二叉搜索树排序树转化为双向链表
二叉树习题系列1--将二叉搜索树排序树转化为双向链表
|
存储 机器学习/深度学习 算法
Java数据结构与算法分析(六)树
树是一种非线性的数据结构,它包含n(n>=1)个节点,(n-1)条边的有穷集合。把它叫做“树”是因为它看起来像一个倒挂的树,也就是说它是根朝上,叶子朝下的。
107 0
|
算法
算法系列-多叉树的遍历
在内卷潮流的席卷下,身为算法小白的我不得不问自己,是否得踏上征程,征服这座巍巍高山。 从零开始,终点不知何方,取决于自己可以坚持多久。 希望你可以和我一样,克服恐惧,哪怕毫无基础,哪怕天生愚钝,依然选择直面困难。
|
算法
堆排序(树的结构)
视频(算法基础课)的:AcWing 838. 堆排序 - AcWing
54 0