今天覆習了二叉樹的鏈式存儲結構,又發現了之前忽略的一些細節問題,現在總結整理如下
問題一:
在字符串賦值函數中,未將全局變量初始化造成錯誤,說明對全局變量理解不夠深入,錯誤代碼及改正如下:
Status StringAssign(String S,char * chars){
int index=1;/*2016-05-11 驚奇的發現這句很重要,找了半天才發現這個錯誤*/
if(strlen(chars)>MAXSIZE)
return ERROR;
else{
S[0]=strlen(chars);
for(index=1;index<=S[0];index++)
S[index]=*(chars+index-1);
}
}
問題二:在用遞歸求二叉樹深度時,寫完if(T->Lchild)之後,沒有寫else的情況,導致程序出錯,說明對遞歸的理解還不夠,還需要多加練習,改正如下:
Status DepthBiTree(BiTree T){
int left=0,right=0;
if(!T)
return 0;
else{
if(T->Lchild)
left=DepthBiTree(T->Lchild);
else
left=0;
if(T->Rchild)
right=DepthBiTree(T->Rchild);
else
right=0;
}
return left>right? left+1:right+1;/*結尾一定要加判斷*/
}
下面記錄部分習題:
Q1:給定二叉樹T,計算其全部節點個數
A:對於計算二叉樹中個數的問題,優先考慮遞歸,本題代碼如下:
Status NodesNum(BiTree T){
if(!T)/*樹爲空時返回0*/
return 0;
else{
return (NodesNum(T->Lchild)+NodesNum(T->Rchild)+1);/*不爲空時返回左子樹節點數+右子樹節點個數+根節點*/
}
}
Q2:給定二叉樹T,打印其全部葉子節點
A:常規方法當然是判斷二叉樹每個節點是否是葉子節點,是則打印,不是則繼續向後判斷。較爲複雜,但是用遞歸則可以輕鬆地解決,代碼如下:
Status PrintLeaves(BiTree T){
if(!T)/*空樹*/
return ERROR;
else{
if(!T->Lchild&&!T->Rchild)/*沒有左右子樹,即爲葉子節點,下一步操作是打印*/
Visit(T->data);
else/*有左右子樹,則打印其左右子樹的葉子節點*/
PrintLeaves(T->Lchild);
PrintLeaves(T->Rchild);
}
}
Q3:給定二叉樹T,求其葉子節點個數
A:依然使用遞歸,聲明兩個變量NumL,NumR,代表左右子樹的葉子節點個數,代碼如下:
int numL,numR;
if(!T)/*空樹返回0*/
return 0;
else{/*不爲空*/
/*如果沒有左右子樹,則是葉子節點,返回1*/
if(!T->Lchild&&!T->Rchild)
return 1;
/*不是左右子樹,則計算其左右子樹的葉子節點個數並賦值給numL,numR,之後返回兩變量之和*/
else{
numL=LeaveNum(T->Lchild);
numR=LeaveNum(T->Rchild);
return (numL+numR);
}
}
}
遞歸是解決二叉樹相關問題中常見的方法,要多加練習,以便能夠熟練應用.
2015-05-11
於教學實驗綜合樓