Learn as if you were to live forever
阿新 • • 發佈:2018-12-25
建立線索二叉樹的過程稱作對二叉樹的線索化,線索化需要在遍歷的過程中來實現。在對二叉樹的某種次序遍歷的過程中,一邊遍歷一邊建立線索,若當前訪問結點的左孩子域為空則建立前趨線索,若右孩子域為空則建立後繼線索。為實現這一過程,可設指標pre指向剛剛訪問過的結點,指標p指向當前結點,就可以方便前趨和後繼線索的填入。
下面給出的是中序線索二叉樹線索化的遞迴演算法,其中函式inorderthr處理頭結點以及與頭結點有關的指標和線索,包括對空二叉樹的特殊處理;並呼叫函式inthreading對非空二叉樹進行中序線索化。演算法描述如下:
bithrtree inorderthr(bithrtree t)//中序線索化二叉樹t並返回頭結點指標,其中pre為指標型全域性變數 { bithrtree thrt;//定義指標型區域性變數 thrt=(bithrtree)malloc(sizeof(bithrnode));//獲取頭結點空間 thrt->ltag=0;thrt->rtag=1;//置線索標誌域 if(t==NULL)//若t為空樹,頭結點的左右指標都回指自身 { thrt->lchild=thrt; thrt->rchild=thrt; } else { thrt->lchild=t;//否則左指標指向t的根結點 pre=thrt;//頭結點送前趨指標變數中 inthreading(t);//對非空樹t中序線索化 pre->rchild=thrt;//最後一個結點線索化 pre->rtag=1;//最後一個結點線索標誌置1 thrt->rchild=pre;//頭結點的右指標指向最後一個結點 } return thrt; }
void inthreading(bithrtree t)//在中序遍歷過程中線索化二叉樹t { if(t!=NULL)//如果二叉樹t不空 { inthreading(t->lchild);//左子樹線索化 if(t->lchild==NULL)//如果t的左指標為空建立前趨線索 { t->ltag=1;t->lchild=pre; } if(pre->rchild==NULL)//如果前趨的右指標為空建立後繼線索 { pre->ltag=1;pre->rchild=p; } pre=p;//修改前趨指標指向當前結點 inthreading(t->rchild);//右子樹線索化 } }