前中后序线索二叉树的构造与遍历代码

一、中序线索二叉树的构造 

#include <iostream>
using namespace std;

//线索二叉树的构造函数
typedef struct TBTNode {
    char data;
    int ltag,rtag;
    struct TBTNode *lchlid;
    struct TNTNode *rchild;
};

//通过中序遍历对二叉树线索化的递归算法
void InThread (TBTNode *p,TBTNode *&pre) { 
    if(p!=NULL) {
        InThread(p->lchlid,pre);  //递归,左子树线索化

        //建立当前结点的前驱线索
        if(p->lchlid==NULL) {
            p->lchlid=pre;
            p->ltag=1;
        }

        //建立当前结点的后驱线索
        if(pre!=NULL&&pre->rchild==NULL) {
            pre->rchild=p;
            pre->rtag=1;
        }

        pre = p; //pre指向当前的p,作为p将要指向的下一个结点的前驱结点指示指针
        p = p->child;  //p指向一个新结点,此时pre和p分别指向的结点形成了一个前驱后继对
                       //为下一次线索的连接做准备
        InThread(p->rchild,pre);  //递归,右子树线索化
    }

}

//通过中序遍历建立中序线索二叉树
void creatInThread(TBTNode *root) { 
    TBTNode *pre=NULL;  //前驱结点指针

    if(root!=NULL) {
        InThread(root,pre);
        pre->rchild=NULL;  //非空二叉树,线索化
        pre->rtag=1;  //后处理中序最后一个结点
    }
}

int main() 
{
    return 0;
}

二、遍历中序线索二叉树

//求以p为根的中序线索二叉树中,中序序列下的第一个结点算法
TBTNode *First(TBTNode *p)
{
    while(p->ltag==0)
        p=p->lchild;  //最左下结点(不一定是叶结点)
    return p;
}
//求在中序线索二叉树中,结点p在中序下的后继结点
TBTNode *Next(TBTNode *p)
{
    if(p->rtag==0)
        return First(p->rchild);
    else
        return p->rchild;  //rtag==1,直接返回后继线索
}
//中序线索二叉树上执行中序遍历算法
void Inorder(TBTNode *root)
{
    for(TBTNode *p=First(root);p!=NULL;p=Next(p))
        Visit(p);  //Visit()是已经定义的访问p所指结点的函数
}

三、前序线索二叉树的构造

//前序线索二叉树
void preThread(TBTNode *p,TBTNode *&pre)
{
    if(p!=NULL)
    {
        if(p->lchild=NULL)
        {
            p->lchild=pre;
            p->ltag=1;
        }

        if(pre!=NULL&&pre->rchild==NULL)
        {
            pre->rchild=p;
            pre->rtag=1;
        }

        pre=p;

        //在递归入口处有限制条件,左右指针不是线索才能继续递归
        if(p->ltag==0)
            preThread(p->lchild,pre);

        if(p->rtag==0)
            preThread(p->rchild,pre);
    }
}

四、遍历前序线索二叉树

void preorder(TBTNode *root)
{
    if(root!=NULL)
    {
        TBTNode *p=root;
        while(p!=NULL)
        {
            while(p->ltag==0) 
            {
                Visit(p);
                p=p->lchild;
            }
            Visit(p);  //此时p左指针必为线索,但还没有被访问,则访问
            p=p->rchild;  //此时p左孩子不存在,则右指针若非空,
                          //则不论是否为线索都指向其后继
        }
    }
}

五、后序线索二叉树的构造

//后序线索二叉树
void postThread(TBTNode *p,TBTNode *&pre)
{
    if(p!=NULL)
    {
        postThread(p->lchild,pre);  //递归,左子树线索化
        postThread(p->rchild,pre);  //递归,右子树线索化

        //建立当前结点的前驱线索
        if(p->lchild==NULL)
        {
            p->lchild=pre;
            p->ltag=1;
        }

        //建立前驱结点的后继线索
        if(pre!=NULL && pre->rchild==NULL)
        {
            pre->rchild=p;
            pre->rtag=1;
        }

        pre=p;
    }
}

猜你喜欢

转载自blog.csdn.net/dyw_666666/article/details/106433017