当前位置:   article > 正文

浙大数据结构——3.1树与树的表示_在二分查找的程序实现中,如果left和right的更新不是取mid+1和mid-1而是都取mid,程

在二分查找的程序实现中,如果left和right的更新不是取mid+1和mid-1而是都取mid,程

什么是树?

客观世界中许多事物存在层次关系

查找

根据某个关键字K,从集合R中找出关键字与K相同的记录。

1、静态查找

2、动态查找

静态查找

1、顺序查找

  1. #define MAXSIZE 10;
  2. typedef struct LNode *List;
  3. struct LNode{
  4. ElementType Element[MAXSIZE];
  5. int length;
  6. };
  7. int SequentialSearch(List Tbl,ElementType K){
  8. int i;
  9. Tbl->Element[0]=K;
  10. for(i=Tbl->length; Tbl->Element[i]!=K; i--);
  11. return i;
  12. }

2、二分查找

前提:假设n个数据元素的关键字满足有序(比如从小到大),并且是连续存放(数组),那么可以进行二分查找。

  1. int BinarySearch(List Tbl,ElementType K){
  2. int mid,NotFound=1;
  3. //左右边界
  4. int left=1;
  5. int right=Tbl->length;
  6. while(left<=right){
  7. mid=(left+right)/2;
  8. if(K<Tbl->Element[mid]){
  9. right=mid-1;
  10. }else if(K>Tbl->Element[mid]){
  11. left=mid+1;
  12. }else{
  13. return mid;
  14. }
  15. }
  16. return NotFound;
  17. }

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。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/388733
推荐阅读
相关标签
  

闽ICP备14008679号