#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 inthread(node*T,node**pre){
if(T){
inthread(T->lchild,pre);
//让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;
inthread(T->rchild,pre);
}
}
node* getfirst(node*T){
while(T->ltag==0){//最左边找到设置过前驱的节点
T=T->lchild;
}
return T;
}
node* getnext(node* current){
if(current->rtag==1){//如果当前节点设置过后继,直接返回右孩子
return current->rchild;
}else{//如果没有的话就去找右子树最左边设置过前驱的点
return getfirst(current->rchild);
}
}
int main(){
node*T;
node*pre=NULL;
create(&T);
inthread(T,&pre);
pre->rtag=1;
pre->rchild=NULL;
for(node*temp=getfirst(T);temp!=NULL;temp=getnext(temp)){
printf("%c",temp->data);
}
return 0;
}
线索二叉树的中序遍历
于 2023-10-16 11:35:39 首次发布