线索二叉树(先序遍历)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值