線索二叉樹的基本操作

來源:互聯網
上載者:User

標籤:

//定義資料類型typedef enum{Link, Thread} PointerTag;      //link = 0表示指向左右孩子指標,Thread = 1表示指向前驅或後繼的線索typedef struct BitNode{    char data;                              //結點資料    struct BitNode *lchild;                 //左右孩子指標    struct BitNode *rchild;    PointerTag ltag;                        //左右標誌    PointerTag rtag;}BitNode, *BiTree; BiTree pre;                                 //全域變數,始終指向剛剛訪問過的結點 //前序建立二叉樹void CreateTree(BiTree T){    char ch;    scanf("%c", &ch);    if(ch == ‘#‘)    {       T= NULL;    }    else    {        if(!T=(BiTree)malloc(sizeof(BitNode))) return 0;        T->data = ch;        CreateTree(T->lchild));        CreateTree(T->rchild));    }    return 0;} ---------------------------------------------------------------------------------------- 中序遍曆線索化,得到中序線索二叉樹//thr指向頭結點,頭結點左鏈lchild指向根結點,頭結點右鏈rchild指向中序遍曆的最後一個結點。int InOrderThraverse_Thr(BiTree T){    BiTree thr;    thr->ltag=Link;    thr-rtag=Thread;    thr->rchild=thr;    if(!T)        thr-lchild=thr;    else{        pre=thr;        InThreading(T);        pre->rtag=Thread;        pre->rchild=thr;        thr->rchild=pre;    }    return OK;} //中序線索化void InThreading(BiTree p){    if(p)    {        InThreading(p->lchild);              //遞迴左子樹線索化         if(!p->lchild)                       //沒有左孩子        {            p->ltag = Thread;                //前驅線索            p->lchild = pre;             //左孩子指標指向前驅,這裡是第3步        }        if(!pre->rchild)                 //沒有右孩子        {            pre->rtag = Thread;              //後繼線索            pre->rchild = p;             //前驅右孩子指標指向後繼(當前結點p)        }        pre=p;         InThreading(p->rchild);              //遞迴右子樹線索化    }}----------------------------------------------------------------------------------------//尋找前驅節點及後繼節點 在中序線索二叉樹上尋找任意結點的中序前驅結點對於中序線索二叉樹上的任一結點,尋找其中序的前驅結點,有以下兩種情況: (1)如果該結點的左標誌為1,那麼其左指標域所指向的結點便是它的前驅結點;(2)如果該結點的左標誌為0,表明該結點有左孩子,根據中序遍曆的定義,它的前驅結點     是以該結點的左孩子為根結點的子樹的最右結點,即沿著其左子樹的右指標鏈向下尋找。     當某結點的右標誌為1 時,它就是所要找的前驅結點。 BiTree InPreNode(BiTree &p){    BiTree pre;    pre=p->lchild;    if(!p->ltag)        while(!pre->rtag){            pre=pre->rchild;        }    }    return pre;}  //在中序線索二叉樹上尋找任意結點的中序後繼結點 對於中序線索二叉樹上的任一結點,尋找其中序的後繼結點,有以下兩種情況:(1)如果該結點的右標誌為1,那麼其右指標域所指向的結點便是它的後繼結點;(2)如果該結點的右標誌為0,表明該結點有右孩子,根據中序遍曆的定義,它的前驅結點     是以該結點的右孩子為根結點的子樹的最左結點,即沿著其右子樹的左指標鏈向下尋找.     當某結點的左標誌為1 時,它就是所要找的後繼結點。 BiTree InPostNode(BiTree &p){    BiTree post;    post=p->rchild;    if(!p->rtag)        while(!post->ltag){            pre=pre->lchild;        }    }    return post;} -------------------------------------------------------------------------------------- //在中序線索二叉樹上尋找值為x的結點(遍曆線索二叉樹)     利用在中序線索二叉樹上尋找後繼結點和前驅結點的演算法,就可以遍曆到二叉樹的所有結點。比如,先找到按某序遍曆的第一個結點,然後再依次查詢其後繼;或先找到按某序遍曆的最後一個結點,然後再依次查詢其前驅。這樣,既不用棧也不用遞迴就可以訪問到二叉樹的所有節點。    在中序線索二叉樹上尋找值為x 的結點,實質上就是線上索二叉樹上進行遍曆,將訪問結點的操作具體寫為那結點的值與x 比較的語句。 BiTree Insearch(BiTree head,chare){    BiTree p;    p=head->lchild;    while(p->ltag==0&&p!=head)      p=head為遍曆結束標誌        p=p->lchild;                找到中序遍曆的第一個節點(最左孩子)    while(p->data!=e&&p!=head)      p=head為遍曆結束標誌        InPostNode(p);    if(p->data==e)        return p;    else{        printf("沒找到");        return 0; } ----------------------------------------------------------------------------------------- //在中序線索二叉樹上的插入與刪除         線索二叉樹的更新是指,線上索二叉樹中插入一個結點或者刪除一個結點。一般情況下,這些操作有可能破壞原來已有的線索,因此,在修改指標時,還需要對線索做相應的修改。一般來說,這個過程的代價幾乎與重新進行線索化相同。這裡僅討論一種比較簡單的情況,即在中序線索二叉樹中插入一個結點p,使它成為結點s 的右孩子。 下面分兩種情況來分析: (1)若s 的右子樹為空白,6.13 (a)所示,則插入結點p 之後成為圖6.13 (b)所示的情形。在這種情況中,     s 的後繼將成為p 的中序後繼,s 成為p 的中序前驅,而p 成為s 的右孩子。二叉樹中其它部分的指標     和線索不發生變化。 (2)若s 的右子樹非空,6.14 (a)所示,插入結點p 之後6.14 (b)所示。S 原來的右子樹變成p 的右     子樹,由於p 沒有左子樹,故s 成為p 的中序前驅,p 成為s 的右孩子;又由於s 原來的後繼成為p 的後     繼,因此還要將s 原來的本來指向s 的後繼的左線索,改為指向p。  下面給出上述操作的演算法。 void InsertThrRight(BiThrTree s,BiThrTree p){       BiThrTree w;    p->rchild=s->rchild;    p->rtag=s->rtag;    p->lchild=s;    p->ltag=1;    s->rchild=p;    s->rtag=0;    if(p->rtag==0)    {        w=InPostNode(p);        w->lchild=p;    }}

線索二叉樹的基本操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.