线索二叉树的先中后序线索化以及找它们的前驱、后继

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 50

//定义线索二叉树(包含三叉链表)
typedef struct ThreadBiTreeNode{
    int data;
    struct ThreadBiTreeNode *lchild,*rchild,*parent;
    int ltag,rtag;
}ThreadBiTreeNode,* ThreadBiTree;

//建立线索二叉树
ThreadBiTree createThreadBiTree(){
    ThreadBiTree T = NULL;
    int data;
    scanf("%d",&data);
    if(data != 99999){
        T = (ThreadBiTree)malloc(sizeof(ThreadBiTreeNode));
        T->data = data;
        T->ltag = 0;
        T->rtag = 0;
        T->lchild = createThreadBiTree();
        if(T->lchild != NULL)
            T->lchild->parent = T;
        T->rchild = createThreadBiTree();
        if(T->rchild != NULL)
            T->rchild->parent = T;

    }
    return T;
}


//先序线索化
//先序遍历:根 左 右
//算法思想:首先传入一个指针p,指向当前结点。一个指针pre,指向当前结点的前驱
//将整棵树先先序遍历一遍,得到结点的访问顺序。
//判断p指向的当前结点是否有左孩子,若有:p->ltag = 0; 若没有:p->lchild = pre; p->ltag = 1;
//然后再判断pre是否有右孩子,若有:pre->rtag = 0; 若没有: pre->rchild = p; pre->rtag = 1;
//按照被访问的顺序 找前驱和后继
//先序,后续线索化,可能发生“爱的魔力转圈圈”现象
void PreThread(ThreadBiTree &p,ThreadBiTree &pre){
    if(p){
        if(p->lchild == NULL){            //根
            p->lchild = pre;
            p->ltag = 1;
        }
        if(pre && pre->rchild == NULL){
            
  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值