1. 程式人生 > >中序遍歷線索二叉樹

中序遍歷線索二叉樹

中序遍歷線索二叉樹的實現與操作

二叉線索樹的結構定義

typedef enum{Link, Thread}PointerTag;
typedef struct ThreadNode
{
    char data;
    ThreadNode *lchild, *rchild;
    PointerTag ltag,
rtag; }ThreadNode, *ThreadTree;

建立一棵二叉樹

void CreateBiTree(ThreadTree &T)
{
    char c;
    cin >> c;
    if(c=='*')T=NULL;
    else
    {
        T=(ThreadTree)malloc(sizeof(ThreadNode));
        T->data=c;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}

建立一棵二叉樹及二叉樹基本操作

void CreateBiTree(ThreadTree &T)
{
    char c;
    cin >> c;
    if(c=='*')T=NULL;
    else
    {
        T=(ThreadTree)malloc(sizeof(ThreadNode));
        T->data=c;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
void visit(ThreadTree T
) { if(T) { cout << T->data << "(" << T->ltag << "," << T->rtag << ")" << " "; } } void PreOrderTraveral(ThreadTree T) { if(T) { visit(T); PreOrderTraveral(T->lchild); PreOrderTraveral(T->rchild); } } void InOrderTraverse(ThreadTree T) { if(T) { InOrderTraverse(T->lchild); visit(T); InOrderTraverse(T->rchild); } } void PostOrderTraverse(ThreadTree T) { if(T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); visit(T); } }

中序遍歷二叉樹線索化的遞迴演算法

//中序遍歷二叉樹線索化的遞迴演算法
void InThread(ThreadTree &p, ThreadTree &pre)
{
    if(p!=NULL)
    {
        InThread(p->lchild, pre);   //遞迴線索化左子樹
        if(p->lchild==NULL)         //左子樹為空,建立前驅線索
        {
            p->lchild=pre;
            p->ltag=Thread;
        }
        if(pre!=NULL&&pre->rchild==NULL)
        {
            pre->rchild=p;          //建立前驅結點的後續線索
            pre->rtag=Thread;
        }
        pre=p;
        InThread(p->rchild, pre);     //遞迴線索化
    }
}

通過中序遍歷建立中序線索二叉樹

//通過中序遍歷建立中序線索二叉樹
void CreateInThread(ThreadTree T)
{
    ThreadTree pre=NULL;
    if(T!=NULL)
    {
        InThread(T, pre);
        pre->rchild=NULL;
        pre->rtag=Thread;
    }
}

中序遍歷

//求中序線索二叉樹中中序序列的第一個結點
ThreadNode *Firstnode(ThreadNode *p)
{
    while(p->ltag!=Thread)
    {
        p=p->lchild;
    }
    return p;
}

//求中序線索二叉樹結點p在中序序列下的後繼結點
ThreadNode *Nextnode(ThreadNode *p)
{
    if(p->rtag!=Thread)
    {
        return Firstnode(p->rchild);
    }
    else
    {
        return p->rchild;
    }
}

//中序遍歷
void InOrder(ThreadNode *T)
{
    for(ThreadNode *p=Firstnode(T); p!=NULL; p=Nextnode(p))
    {
        visit(p);
    }
}

主函式

int main()
{
    ThreadTree T=NULL;
    CreateBiTree(T);
    InOrderTraverse(T);
    cout << endl;
    CreateInThread(T);
    InOrder(T);
    return 0;
}

測試

在這裡插入圖片描述