浙大数据结构——3.1树与树的表示

什么是树?

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

查找

根据某个关键字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。

 

 

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值