美文网首页
线索二叉树

线索二叉树

作者: catttthrine | 来源:发表于2018-11-01 21:57 被阅读0次

今天刷题的时候发现结构算法1800上的题关于线索二叉树的没有考很深,但是如果对整个基础算法没有很好地把握的话做题还是有几个点有点疑惑,于是把整个完整线索化整理了一下,包括前中后序的差别,以中序为例(毕竟递归只是换换执行顺序),把过程整个推了一遍终于把递归的逻辑理通了。

线索化的本质是把非线性结构变成线性结构,利用二叉链表的空链域存放指向直接前驱和后继的指针。
熟悉了这个结构以后解决对应得问题也变得很轻松了
几个经典问题:关于某结点的前驱后继问题,空的链域有几个,线索数,类似后序非递归遍历的,后序线索树的遍历仍需要栈的支持,联考还考过符合后续线索树定义的图像,如果对过程很熟悉可以用来验证答案。

需要注意的是后序线索二叉树不能有效解决求后续后继的问题,仍应按常规办法寻找。

存储结构

typedef struct ThreadNode{
        int data;//数据
        struct ThreadNode *lchild,rchild;
        int ltag, rtag;
}ThreadNode, *ThreadTree;

其中引入了标志域:
Ltag 为0表示lchild域指向左孩子
Ltag 为1表示lchild域指向直接前驱
Rtag 为0表示rchild域指向右孩子
Rtag 为1表示rchild域指向直接后继

void InThread(ThreadTree &p, ThreadTree &pre)
{
        //inorder so we start from left tree :)
        if(p!=NULL)
        {
            InThread(p->lchild, pre);
            //when first iterator pre =null
            if(p->lchild == NULL){
                p->lchild = pre;
                p->ltag = 1;
            }
            if(pre!=NULL && pre->rchild == NULL){
                pre->rchild = p;
                pre->rtag = 1;
            }
            pre = p;
            InThread(p->rchild, pre);
            //Then we finished right side
        }
        
}

递归的算法看起来很简单但是如果真的走一遍还是会发现很多问题的,所以画了个图


初始状态

让我们进入第一次迭代,递归的执行左移的操作,此时pre始终为空,终于我们来到了最左边的结点~
最左结点的lchild肯定为空啦,所以将他的前驱lchild设为pre,但此时pre为NULL,于是lchild域置空,ltag为1,标记它是一条线索。


IMG_8778.JPG
IMG_8773.JPG
而此时pre为NULL跳过第二段判定,令pre = p

进入当前循环的右子树部分,p右移到最右,此时的p左子树为空,pre指向我们刚才搞完的B结点,所以把p的直接前驱=pre所指结点,pre !=null 但 pre的rchild != null所以pre 指向 D结点 结束


IMG_8774.JPG
此时第一次迭代中的第一条语句才执行完,p仍指向root
其lchild不为空,但此时pre!=null && pre->rchild == null了
于是我们将pre所指向结点的rchild指向当前的p,
继续pre = p,并开始递归线索化右子树!
IMG_8775.JPG
p右移到最右结点(这图好简单),先进入到他的最左结点,此时pre仍在根节点哦,因为当前结点没有lchild,所以前驱设为pre指向结点,即根节点,然后pre就可以名正言顺的指向E结点了
此时C结点的左子树结束
IMG_8776.JPG

lchild不为空跳过,此时pre!=null && rchild == null,pre->rchild = p; pre 指向C结点,因为C无右子树,这个时候A结点的右子树也结束了。


IMG_8777.JPG
再执行完整个InThread之后,我们应把pre指向结点的后继置空,表示整个线索的结束。

相关文章

  • 线索二叉树操作

    树节点 创建中序线索二叉树 遍历中序线索二叉树 创建前序线索二叉树 遍历前序线索二叉树 参考:https://bl...

  • 二叉树—线索二叉树

    1、线索二叉树的引入 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或...

  • javascript线索化二叉树

    定义二叉树创建方法 对二叉树进行中序线索化 遍历线索二叉树 测试

  • 数据结构线索二叉树

    线索二叉树构成 线索化的节点 实现

  • 数据结构与算法分析四 树(续)

    ** 顺序存储 ** 线索化二叉树 线索化代码实现

  • 理解线索二叉树

    原链接:理解线索二叉树|CloudWong 线索二叉树原理 遍历二叉树的其实就是以一定规则将二叉树中的结点排列成一...

  • 数据结构题目56:线索二叉树的更新

    题目:线索二叉树的更新所谓线索二叉树的更新是指在线索二叉树中插入一个结点或者删除一个结点。一般情况下,这些操作有可...

  • 数据结构与算法13-线索二叉树

    定义 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历...

  • 线索化二叉树的实现

    概念   在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行...

  • 数据结构与算法[线索化二叉树]

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其...

网友评论

      本文标题:线索二叉树

      本文链接:https://www.haomeiwen.com/subject/yzdfxqtx.html