考研加油!!!!!!!
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. 取下界 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;
}
}