数据结构——树(二)(2022考研)

线索二叉树

以下是基本操作

#include "stdio.h"
#include "stdlib.h"

#define ElemType int

typedef struct ThreadNode{
    ElemType data;
    struct ThreadNode *rchild,*lchild;
    int ltag,rtag;
}ThreadNode,*ThreadTree;

ThreadNode *pre=NULL;

//中序线索化
void visit1(ThreadNode *q){
    if(q->lchild==NULL){
        q->lchild=pre;
        q->ltag=1;
    }
    if(pre!=NULL && pre->rchild==NULL){
        pre->rchild=q;
        pre->rtag=1;
    }
    pre=q;
}
void InThread(ThreadTree T){
    if(T!=NULL){
        InThread(T->lchild);
        visit1(T);
        InThread(T->rchild);
    }
}
void CreateInThread(ThreadTree T){
    pre=NULL;
    if(T!=NULL){
        InThread(T);
        if(pre->rchild==NULL){
            pre->rtag=1;
        }
    }
}

//先序线索化
void visit2(ThreadNode *q){
    if(q->lchild==NULL){
        q->lchild=pre;
        q->ltag=1;
    }
    if(pre->rchild==NULL && pre!=NULL){
        pre->rchild=q;
        pre->rtag=1;
    }
    pre=q;
}
void PreThread(ThreadTree T){
    if(T!=NULL)
    {
        visit2(T);
        if(T->ltag==0)
            PreThread(T->lchild);
        PreThread(T->rchild);
    }
}
void CreatePreThread(ThreadTree T){
    if(T!=NULL)
    {
        PreThread(T);
        if(pre->rchild==NULL)
            pre->rtag=1;
    }
}

//利用线索二叉树中序遍历
void visit(ThreadNode *q){
    printf("%d",q->data);
}
ThreadNode *FirstNode(ThreadTree T){
    while(T->ltag==0)
        T=T->lchild;
    return T;
}
ThreadNode * InNextNode(ThreadNode *p){
    if(p->rtag==0){
        return FirstNode(p->rchild);
    }
    if(p->rtag==1)
        return p->rchild;
}
void InOrder(ThreadTree T){
    for(ThreadNode *p=FirstNode(T);p!=NULL;p= InNextNode(p))
        visit(p);
}

//利用线索二叉树逆向中序遍历
ThreadNode *LastNode(ThreadNode *p){
    while(p->rtag==0)
        p=p->rchild;
    return p;
}
ThreadNode * InPreNode(ThreadNode *p){
    if(p->ltag==0)
        return LastNode(p->lchild);
    if(p->ltag==1)
        return p->lchild;
}
void RevInOrder(ThreadNode *T)
{
    for(ThreadNode *p= LastNode(T);p!=NULL;p= InPreNode(p))
        visit(p);
}

//利用线索二叉树先序遍历
ThreadNode * PreNextNode(ThreadNode *p){
    if(p->rtag==1)
        return p->rchild;
    if(p->rtag==0)
    {
        if(p->ltag==0)
            return p->lchild;
        if(p->ltag==1)
            return p->rchild;
    }
}
void PreOrder(ThreadNode *T){
    for(ThreadNode *p=T;p!=NULL;p= PreNextNode(p))
        visit(p);
}

//先序前驱需要利用三叉链表通过找到父节点

//利用线索二叉树后序遍历
ThreadNode * LastPreNode(ThreadNode *p){
    if(p->ltag==1)
        return p->lchild;
    if(p->ltag==0){
        if(p->rtag==1)
            return p->lchild;
        if(p->rtag==0)
            return p->rchild;
    }
}
void LastOrder(ThreadTree T){
    for(ThreadNode *p= FirstNode(T);p!=NULL;p= LastPreNode(p))
        visit(p);
}

//后序后继需要利用三叉链表通过找到父节点

来一道小练习题
在这里插入图片描述

//习题5.18---在中序线索树中查找后序的前驱
ThreadNode * SeaPostpreNodeFroInTree(ThreadTree T,ThreadNode *p){
    ThreadNode *q;
    if(p->rtag==0)
        q=p->rchild;
    else if(p->ltag==0)
        q=p->lchild;
    else if(p->lchild==NULL)
        q=NULL;
    else{
        while(p->ltag==1 && p->lchild!=NULL)
            p=p->lchild;
        if(p->ltag==0)
            q=p->lchild;
        else
            q=NULL;
    }
    return q;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值