中序线索二叉树

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define maxsize 10
using namespace std;

typedef struct TBTNode{
 char data;
 int ltag,rtag;
 TBTNode *lchild;
 TBTNode *rchild;
}TBTNode;
void create(TBTNode *&p)  //先序遍历创建二叉树
{
    char k;
    scanf("%c",&k);
    if(k=='#') p=NULL;
    else
    {
        p=(TBTNode *)malloc(sizeof(TBTNode));
        p->data=k;
        p->ltag=0;
        p->rtag=0;
        create(p->lchild);
        create(p->rchild);
    }
}
void inthread(TBTNode *p,TBTNode *&pre)
{
    if(p!=NULL)
    {
        inthread(p->lchild,pre);
        if(p->lchild==NULL)
        {
            p->lchild=pre;
            p->ltag=1;
        }

        if(pre!=NULL&&pre->rchild==NULL) //后继线索,中序遍历第一个节点为首次pre
        {
            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
        inthread(p->rchild,pre);
    }
}
TBTNode *first(TBTNode *p) //左子树到头
{
    while(p->ltag==0) p=p->lchild;
    return p;
}
TBTNode *next(TBTNode *p) //找后继
{
    if(p->rtag==0) return first(p->rchild);
    else return p->rchild;
}
void inorder(TBTNode *p)
{

    TBTNode *q=first(p);
    for(;q!=NULL;q=next(q))
    {
        printf("%c ",q->data);
    }
    printf("\n");
}
void createinthread(TBTNode *root)
{
    TBTNode *pre=NULL;
    if(root!=NULL)
    {
    inthread(root,pre);
    pre->rchild=NULL;
    pre->rtag=1;
    }
    printf("%c\n",first(root)->data);
    printf("%c\n",next(root)->data);
    inorder(root);
}
TBTNode *last(TBTNode *p)  //找最右头
{
    while(p!=NULL&&p->rtag!=1)
    {
        p=p->rchild;
    }
    return p;
}
TBTNode *pre(TBTNode *p)  //找前驱
{

        if(p!=NULL&&p->ltag==1) return p->lchild;
        else return last(p->lchild);

}
TBTNode *prenext(TBTNode *p) //前驱下的后继
{
    if(p!=NULL)
    {
        if(p->ltag==0) return p->lchild;
        else if(p->rtag==0) return p->rchild;
        else
        {
            p=p->rchild;
            while(p->rtag!=0)
            {
                p=p->rchild;
            }
            return p->rchild;
        }
    }
}
int main()
{
    TBTNode *T=NULL;
    create(T);
    createinthread(T);
    printf("%c\n",prenext(T->lchild->rchild)->data);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39350434/article/details/81636963