树的总结(一)

考研加油!!!!!!!

1.1树的重要概念

1.树是一种重要的非线性结构;在有n个结点的树中有n-1条边;

2.在结点个数为n(n>1)的各棵树中,深度最小的树的深度是多少?它有多少叶子结点?多少分支结点?深度最大的树的深度是多少?它有多少叶子结点?多少分支结点?(不是二叉树)

解:深度最小时,树的宽度最大,其深度为2,有2层;它有n-1个叶子结点,1个分支结点。

       深度最大时,其深度为n,有n层,有1个叶子结点,n-1个分支结点。   (分支结点包括根结点)

3.树的总结点数N,数的分支数B, N=B+1;  

4.对于一棵m叉树(设根在第一层),从0开始自上向下分层给各结点编号。问编号为K的结点的双亲结点编号是多少?问编号为K的结点的第一个子女的编号是多少?

解:1.(K-1)/m  取下界      2.K*m+1   

4.利用递归算法,计算二叉树T的高度

//求二叉树的深度(树的深度也即树的高度) 
/*求二叉树高度的问题转化为:先求树的左子树的高度,再求右子树的高度,
然后返回两者的最大值加1 ,就是树的高度*/ 
int getDepth(BTNode *p)
{
	int LD,RD;
	if(p==NULL)
	   return 0;
	else
	{
		LD=getDepth(p->lchild);
		RD=getDepth(p->rchild);
		return (LD>RD?LD:RD)+1;
	}
}

5.设计一个递归算法,统计树T的结点总数

//计算一棵给定的二叉树的结点个数
/*解法一:遍历这课树,设置一个全局变量n,初值为0,每当经过一个结点,全局变量自动增加1*/ 
int n;
void count(BTNode *p)
{
	if(p!=NULL)  //采用先序遍历 
	{ 
	   ++n;
	   count(p->lchild);
	   count(p->rchild);
	}	   
 } 
/*解法二:先计算出左子树的结点数,再数出右子树的结点数*/
int count1(BTNode *p)
{
	int n1,n2;
	if(p==NULL)   //采用后序遍历 
	   return 0;
	else
	{
		n1=count1(p->lchild);
		n2=count1(p->rchild);
		return n1+n2+1;
	}
 } 
 

6.设计一个递归算法,统计树T的叶子结点个数

 //计算一棵给定的二叉树的叶子结点个数
//解法一: 
int m=0;
void count2(BTNode *p)
{
	if(p!=NULL)
	{
		if(p->lchild==NULL&&p->rchild==NULL)
		   m++;
		count2(p->lchild);
		count2(p->rchild);
	}
} 
//解法二: 
int count3(BTNode *p)
{
	int n1,n2;
	if(p==NULL)
	   return 0;
	else if(p->lchild==NULL&&p->rchild==NULL)
	     return 1;
	else
	{
		n1=count3(p->lchild);
		n2=count3(p->rchild);
		return n1+n2;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章