中序遍历线索二叉树

二叉线索树的结构定义

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;
}

测试

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36784975/article/details/84203586