樹的總結(一)

考研加油!!!!!!!

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;
	}
}

 

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