二叉树的线索化及其前驱后继查找

一 实质

遍历二叉树过程中用线索(前驱和后继)取代空指针的的做法


二 算法分析(给出中序化):

主要是增加俩个指针,pre指针始终指向刚刚访问过的节点,p指针始终指向当前访问的节点其中,*pre是*p的前驱,*p是*pre的后继

三 中序线索化算法:

//将二叉树按中序线索化算法
typedef enum   {Link,Thread} PointerTag;//枚举值分别为0,1
typedef struct node
{
    DataType data;
    PointerTag ltag,rtag;   //左右标志
    struct node *lchild ,*rchild;
}BinThrNode;//线索二叉树节点类型
typedef BinThrNode *BinThrTree;
void InorderThreading(BinThrTree p)
{//将二叉树p中序线索化
    if(p)//p非空时,当前访问结点是*p
    {
        InorderThreading(p->lchild);//左子树线索化
        //建立正在访问节点的前驱结点之间的线索
        t->ltag = (t->lchild)?Link:Thread;
        t->rtag = (t->rchild)?Link:Thread;
        if(pre)
        {
            if(pre->rtag==Thread)
                pre->rchild = p;
            if(p->ltag==Thread)
                p->lchid = pre;
        }
        pre = p;
        InorderThreading(t->rchild);//右子树线索化
    }
}

算法分析:和中序遍历一样递归过程对每个节点仅做一次访问,因此对于n个节点的二叉树算法复杂度为O(n)

四 前驱和后继的查找

BinThrNode *InorderSuccessor(BinThrNode *p)
{//在中序线索树查找*p的后继
    BinThrNode *q;
    if(p->rtag==Thread)
        return p->rchlid;//返回其所指的后继
    else
    {
        q = p->rchild;//从*p的右孩子开始查找
        while(q->ltag==Link)
            q = q->lchild;//左子树为空,沿左链往下查找
        return q;
    }
}
 BinThrNode *Inorderpre(BinThrNode *p)
      {//在中序线索树中找结点*p的中序前趋,设p非空
         BinThrNode *q;
        if (p->ltag==Thread) //*p的左子树为空
               return p->lchild; //返回左线索所指的中序前趋
         else{
               q=p->lchild; //从*p的左孩子开始查找
               while (q->rtag==Link)
                    q=q->rchild; //右子树为空时,沿右链往下查找
               return q; //当q的右子树为空时,它就是最右下结点
             } //end if
      }

从上面可以看出,对与非线索二叉树,查找其节点十分困难需要遍历,而线索二叉树加入了前驱和后继之后是这种查找变得简单易行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值