赞
踩
客观世界中许多事物存在层次关系
根据某个关键字K,从集合R中找出关键字与K相同的记录。
1、静态查找
2、动态查找
1、顺序查找
- #define MAXSIZE 10;
- typedef struct LNode *List;
- struct LNode{
- ElementType Element[MAXSIZE];
- int length;
- };
-
- int SequentialSearch(List Tbl,ElementType K){
- int i;
- Tbl->Element[0]=K;
- for(i=Tbl->length; Tbl->Element[i]!=K; i--);
- return i;
- }
2、二分查找
前提:假设n个数据元素的关键字满足有序(比如从小到大),并且是连续存放(数组),那么可以进行二分查找。
- int BinarySearch(List Tbl,ElementType K){
- int mid,NotFound=1;
- //左右边界
- int left=1;
- int right=Tbl->length;
- while(left<=right){
- mid=(left+right)/2;
- if(K<Tbl->Element[mid]){
- right=mid-1;
- }else if(K>Tbl->Element[mid]){
- left=mid+1;
- }else{
- return mid;
- }
- }
- return NotFound;
- }
Q:在二分查找的程序实现中,如果left和right的更新不是取mid+1和mid-1而是都取mid,程序也是正确的吗?
A:错误。比如进入循环体的时候
left
为1,right
为2,可能会导致死循环。
1、判定树上每个结点需要的查找次数刚好为该结点所在的层数。
2、查找成功时查找次数不会超过判定树的深度。
3、n个结点的判定树的深度为log2N+1。
4、平均查找次数ASL=(4*4+4*3+2*2+1)/ 11 = 3
n(n>=0)个结点构成的有限集合。
1、子树是不相交的。
2、除了根节点外,每个结点有且仅有一个父节点。
3、一棵N个结点的树有N-1条边。
Q:有一个m棵树的集合(也叫森林)共有k条边,问这m颗树共有多少个结点?
A:k+m。一条边对应一个结点,但是根节点是没有边对应的,所以结点会比边数多一个。m棵树多m个结点。所以是k+m。
1、结点的度:结点的子树个数。
2、树的度:树的所有结点中最大的度数。
3、叶结点:度为0的结点。
4、父结点:有子树的结点是其子树的根节点的父结点。
5、子结点:若A结点是B结点的父结点,则称B结点是A结点的子结点,子结点也称孩子结点。
6、兄弟结点:具有同一父结点的各结点彼此是兄弟结点。
7、路径和路径长度:经过的结点、经过的边个数。
8、祖先结点:爸爸、爷爷、太爷爷......
9、子孙结点:儿子、孙子、曾孙......
10、结点的层次:第几层
11、树的深度:最大层次
儿子兄弟表示法:
Q:在用“儿子-兄弟”法表示的树中,如果从根结点开始访问其“次子”的“次子”,所经过的结点数与下面哪种情况一样?(注意:比较的是结点数,而不是路径)
A.从根结点开始访问其“长子”的“长子”
B.从根结点开始访问其“长子”的“长子”的“长子”
C.从根结点开始访问其“长子”的“长子”的“长子”的“长子”
D.不能确定,要看具体树结构
A:选C。从根结点开始访问其“次子”的“次子”所经过的结点,就是下图中圈红的结点。
(上图是借用百度贴吧一个大佬的图解)
将树顺时针旋转45度即为二叉树。
Q:一棵度为 m的树有n个节点。若每个节点直接用m个链指向相应的儿子,则表示这个树所需要的总空间是n*(m+1) (假定每个链以及表示节点的数据域都是一个单位空间).。当采用儿子/兄弟(First Child/Next Sibling)表示法时,所需的总空间是:
A.3n
B.2n
C.n*m
D.n*(m-1)
A:选A。m为树中最大的子树个数。“每个节点直接用m个链指向相应的儿子”意思是一个结点有m个指针域。这个树所需要的总空间是n*(m+1),加1是包含了数据域的。当采用儿子/兄弟(First Child/Next Sibling)表示法,意思是有n个结点,每个结点有两个指针域而不是m个,那么所需的空间是两个指针域+一个数据域的n倍,即3n。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。