21

严蔚敏视频 笔记21

先序序列的规律:根结点为第一个元素
中序序列的规律:根结点在左子树和右子树的中间

根据先序和中序就可唯一确定一个二叉树

6.5 线索二叉树

线索二叉树:
遍历二叉树的结果是求得结点的一个线性序列
指向该线性序列中的前驱后继的指针称作线索
包含线索的存储结构叫做线索链表

约定:
在二叉链表的结点中增加两个标志域,并作如下规定:
若左子树不空,则lchild域的指针指向其左子树,左标志域的值为0;否则lchild域的指针指向其前驱,且左标志域的值为1
若右子树不空,则rchild域的指针指向其右子树,右标志域的值为0;否则rchild域的指针指向其后继,且右标志域的值为1

线索链表的结构描述
typedef enum{Link,Thread} PointerThr;
// Link==0, Thread==1
typedef struct BiThrNode {
    TElemType data;
    struct BiThrNode *lchild,*rchild; //
左右指针
    PointerThr LTag,RTag; //
左右标志
} BiThrNode, *BiThrTree;


遍历算法
for(p=firstNode(T);p;p=Succ(p)) Visit(p);

关键:找第一个结点 找后继
中序线索化链表的遍历算法
Status InOrderTraverse_Thr(BiThrTree T,Status (*Visit)(TElemType e)) {
    p=T->lchild; // p
指向根结点
    while(p!=T) { //
空树或遍历结束时,p==T
        while(p->LTag==Link) p=p->lchild;
        if(!Visit(p->data)) return ERROR;
        while(p->RTag==Thread&&p->rchild!=T) {
            p=p->rchild; Visit(p->data); //
访问后继结点

        }
        p=p->rchild; // p
进至其右子树根
    }
    return OK;
}
中序使用起来最方便

如何建立线索链表
在中序遍历过程中修改结点的左右指针域,以保存当前访问结点的前驱后继信息,遍历过程中附设指针pre,并始终保持指针pre指向当前访问的指针p所指结点的前驱

void InThreading(BiThrTree p) {
    if(p) {
        InThreading(p->lchild); //
左子树线索化

        if(!p->lchild) {
            p->LTag=Thread;
            p->lchild=pre;
        } //
建立前驱线索
        if(!pre->rchild) {
            pre->RTag=Thread;
            pre->rchild=p;
        } //
建立后继线索
        pre=p;
        InThreading(p->rchild); //
右子树线索化
    }
}

Status InOrderThreading(BiThrTree &Thrt,BiThrTree T) {
    if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
    Thrt->LTag=Link;
    Thrt->RTag=Thread;
    Thrt->rchild=Thrt;
    if(!T) Thrt->lchild=Thrt; //
添加头结点

    else {
        Thrt->lchild=T;
        pre=Thrt;
        InThreading(T);
        pre->rchild=Thrt; //
子树线索化
        pre->RTag=Thread;
        Thrt->rchild=pre; //
处理最后一个结点
    }
    return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值