1. 程式人生 > >Learn as if you were to live forever

Learn as if you were to live forever

建立線索二叉樹的過程稱作對二叉樹的線索化,線索化需要在遍歷的過程中來實現。在對二叉樹的某種次序遍歷的過程中,一邊遍歷一邊建立線索,若當前訪問結點的左孩子域為空則建立前趨線索,若右孩子域為空則建立後繼線索。為實現這一過程,可設指標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);//右子樹線索化
    }
}