#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
今日推荐
周排行