zoukankan      html  css  js  c++  java
  • 线索二叉树

    一、线索二叉树的原理

        通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。

         n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。

      (除根结点以外,所有结点都有一共指向它的结点,所有非空链域为n-1,空链域为n+1)

      因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。

        记ptr指向二叉链表中的一个结点,以下是建立线索的规则:

        (1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点。这个结点称为ptr的中序前驱;

        (2)如果ptr->rchild为空,则存放指向中序遍历序列中该结点的后继结点。这个结点称为ptr的中序后继;

      显然,在决定lchild是指向左孩子还是前驱,rchild是指向右孩子还是后继,需要一个区分标志的。因此,我们在每个结点再增设两个标志域ltag和rtag,注意ltag和rtag只是区分0或1数字的布尔型变量,其占用内存空间要小于像lchild和rchild的指针变量。结点结构如下所示。

        其中:

        (1)ltag=0    时指向该结点的左孩子,为1时指向该结点的前驱

        (2)rtag=0   时指向该结点的右孩子,为1时指向该结点的后继

        (3)因此对于上图的二叉链表图可以修改为下图下的样子。

      

    二、线索二叉树结构实现

      存储结构

    typedef char DataType;
    typedef enum{Link, Thread}PointerTag;    //Link = 0表示指向左右孩子指针;Thread = 1表示指向前驱或后继的线索
    struct BitNode{
        DataType data;
        BitNode *lchild, *rchild;
        PointerTag ltag;
        PointerTag rtag;   
    };
    typedef BitNode* BitTree;
      中序遍历线索化
    BitTree pre;
    void InThreading(BitTree p){
        if(p){
            InThreading(p->lchild);//递归左子树线索化
            if (!p->lchild)//没有左孩子
            {
               p->ltag= Thread;//前驱线索
               p->lchild=pre;//左孩子指向前驱
            }
            if (!p->rchild)//没有右孩子
            {
               pre->rtag= Thread;//后继线索
               pre->rchild=p;//前驱右孩子指向后继
            }
            pre = p;
            InThreading(p->rchild);
        }
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13039358.html

  • 相关阅读:
    对单片机存储分配新的认识
    超简单的word转swf 实现
    纯真IP数据库
    webservice 特殊字符处理
    QQ输入法导致win8 x64 装不上vs11,打不开记事本,等各种变态问题
    时间戳转换
    Remote Desktop Organizer 1.4.5
    Xcdoe 4.6 dbank下载
    链接复用
    Visual Studio 2012 序列号
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13039358.html
Copyright © 2011-2022 走看看