#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct tree{
char data;
struct tree*lchild;
struct tree*rchild;
int ltag;
int rtag;
}node;
void create(node**T){
char data;
scanf("%c",&data);
getchar();
if(data=='#'){
*T=NULL;
}else{
*T=(node*)malloc(sizeof(node));
(*T)->data=data;
(*T)->ltag=0;
(*T)->rtag=0;
create(&((*T)->lchild));
create(&((*T)->rchild));
}
}
void prethread(node*T,node**pre){
if(T){
//让T去处理前驱
if(T->lchild==NULL){
T->ltag=1;
T->lchild=*pre;
}
//让pre去处理后继
if(*pre!=NULL&&(*pre)->rchild==NULL){
(*pre)->rtag=1;
(*pre)->rchild=T;
}
//让pre去追赶T
*pre=T;
//由于前面当T->lchild==NULL时设置了前驱T->lchild=*pre
//如果此时再去递推则会发生错误。(自己画图看看)
//所以应当在ltag==0(即没设置过前驱时)去递推
if(T->ltag==0){
prethread(T->lchild,pre);
}
prethread(T->rchild,pre);
}
}
node* getnext(node* T){
//如果有后继则返回后继T->rchild
//如果有前驱,说明以及遍历过了,也应当返回T->rchild
if(T->rtag==1||T->ltag==1){
return T->rchild;
}else{//如果既有右子树又有左子树那就按照根左右返回左孩子即可
return T->lchild;
}
}
int main(){
node*T;
node*pre=NULL;
create(&T);
prethread(T,&pre);
pre->rtag=1;
pre->rchild=NULL;
for(node*temp=T;temp!=NULL;temp=getnext(temp)){
printf("%c",temp->data);
}
return 0;
}
线索二叉树(先序遍历)
于 2023-10-17 13:21:51 首次发布