1. 程式人生 > 實用技巧 >線索二叉樹的構造

線索二叉樹的構造

首先明確線索二叉樹的概念,線索二叉樹是原本二叉樹n個節點中未分配的n-1個孩子指標改為線索指標,左孩子指向前驅結點,右孩子指向後繼節點。

中序線索二叉樹的構造就要明確中序遍歷:

#include<iostream>
using namespace std;
struct BiTree{
    int date;
    BiTree*lchild,*rchild;
    int ltag,rtag;//如果左孩子是線索則ltag為1
};
void visit(BiTree*t){//visit函式
    cout<<t->date;
}
void InOrder(BiTree*T){//
中序遍歷 if(T){ InOrder(T->lchild); visit(T); InOrder(T->rchild); } }

以上程式碼將輸入中序遍歷的序列,修改新增以下程式碼:

void InOrder(BiTree*&T,BiTree*&pre){//既然要修改指標的指向,那就一定要用指標的引用
    if(T){
        InOrder(T->lchild,pre);
        if(T->lchild==NULL)//表示指向左子樹的指標沒有使用,可以用於指向前驅結點
{ T->lchild=pre;//改為指向其前驅結點 T->ltag=1; } if(pre!=NULL&&pre->rchild==NULL){ pre->rchild=T; pre->rtag=1; } pre=T; visit(T); InOrder(T->rchild,pre); } }

函式只是對沒有使用的指標做了修改,結果仍然輸出的是中序序列,所以函式對二叉樹的線索化也是沿著中序遍歷的順序進行的。同理可以寫出先序遍歷和後序遍歷的線索化。

注意:對於最後一個節點,並沒有對其線索化,在主函式中要單獨修改。