閱讀以下說明和C 函數(shù),將應(yīng)填入 (n) 處的字句寫在答題紙的對(duì)應(yīng)欄內(nèi)。
【說明】
已知某二叉樹的非葉子結(jié)點(diǎn)都有兩個(gè)孩子結(jié)點(diǎn),現(xiàn)將該二叉樹存儲(chǔ)在結(jié)構(gòu)數(shù)組 Ht中。結(jié)點(diǎn)結(jié)構(gòu)及數(shù)組Ht的定義如下:
#define MAXLEAFNUM 30
struct node{
char ch; /*當(dāng)前結(jié)點(diǎn)表示的字符,對(duì)于非葉子結(jié)點(diǎn),此域不用*/
char *pstr; /*當(dāng)前結(jié)點(diǎn)的編碼指針,非葉子結(jié)點(diǎn)不用*/
int parent; /*當(dāng)前結(jié)點(diǎn)的父結(jié)點(diǎn),為0時(shí)表示無父結(jié)點(diǎn)*/
int lchild,rchild;
/*當(dāng)前結(jié)點(diǎn)的左、右孩子結(jié)點(diǎn),為0時(shí)表示無對(duì)應(yīng)的孩子結(jié)點(diǎn)*/
};
struct node Ht[2 * MAXLEAFNUM]; /*數(shù)組元素Ht[0]不用*/
該二叉樹的n個(gè)葉子結(jié)點(diǎn)存儲(chǔ)在下標(biāo)為1~n的Ht數(shù)組元素中。例如,某二叉樹如圖3-1所示,其存儲(chǔ)結(jié)構(gòu)如圖3-2所示,其中,與葉子結(jié)點(diǎn)a對(duì)應(yīng)的數(shù)組元素下標(biāo)為1,a 的父結(jié)點(diǎn)存儲(chǔ)在 Ht[5],表示為 Ht[1].parent=5。Ht[7].parent=0 表示 7 號(hào)結(jié)點(diǎn)是樹根,Ht[7].lchild=3、Ht[7].rchild=6 分別表示 7 號(hào)結(jié)點(diǎn)的左孩子是 3號(hào)結(jié)點(diǎn)、右孩子是 6 號(hào)結(jié)點(diǎn)。
如果用“0”或“1”分別標(biāo)識(shí)二叉樹的左分支和右分支(如圖 3-1 所示),從根結(jié)點(diǎn)開始到葉子結(jié)點(diǎn)為止,按所經(jīng)過分支的次序?qū)⑾鄳?yīng)標(biāo)識(shí)依次排列,可得到一個(gè) 0、1序列,稱之為對(duì)應(yīng)葉子結(jié)點(diǎn)的編碼。例如,圖3-1中a、b、c、d的編碼分別是100、101、0、11。
函數(shù)LeafCode(Ht[],n)的功能是:求解存儲(chǔ)在Ht中的二叉樹中所有葉子結(jié)點(diǎn)(n個(gè))的編碼,葉子結(jié)點(diǎn)存儲(chǔ)在Ht[1]~Ht[n]中,求出的編碼存儲(chǔ)區(qū)由對(duì)應(yīng)的數(shù)組元素pstr域指示。
函數(shù)LeafCode從葉子到根逆向求葉子結(jié)點(diǎn)的編碼。例如,對(duì)圖3-1中葉子結(jié)點(diǎn)a求編碼的過程如圖3-3所示。
typedef enum Status {ERROR, OK} Status;
【函數(shù)】
Status LeafCode(struct node Ht[], int n)
{
int pc, pf; /*pc用于指出樹中的結(jié)點(diǎn),pf則指出pc所對(duì)應(yīng)結(jié)點(diǎn)的父結(jié)點(diǎn)*/
int i,start;
char tstr[31] = {‘\0’}; /*臨時(shí)存儲(chǔ)給定葉子結(jié)點(diǎn)的編碼,從高下標(biāo)開始存入*/
for(i=1;(1) ; i++) { /*對(duì)所有葉子結(jié)點(diǎn)求編碼,i表示葉結(jié)點(diǎn)在HT數(shù)組中的下標(biāo)*/
start = 29;
pc = i; pf = Ht[i].parent;
while (pf != (2) ) { /*沒有到達(dá)樹根時(shí),繼續(xù)求編碼*/
if ( (3) .lchild == pc ) /*pc所表示的結(jié)點(diǎn)是其父結(jié)點(diǎn)的左孩子*/
tstr[--start] = ‘0’;
else
tstr[--start] = ‘1’;
pc = (4) ; pf = Ht[pf].parent; /*pc和pf分別向根方向回退一層*/
}/* end of while */
Ht[i].pstr = (char *) malloc(31-start);
if (!Ht[i].pstr) return ERROR;
strcpy(Ht[i].pstr, (5) );
}/* end of for */
return OK;
}/* end of LeafCode */