线索二叉树

线索二叉树

问题:为什么要研究线索二叉树

当用二叉链表作为二叉树的存储结构时,可以很方便地找到某个结点的左右孩子;但一般情况下,无法直接找到该结点在某种遍历序列中的前驱和后继结点

线索二叉树

  • 定义:利用二叉树的空指针域,如果某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱;如果某结点的右孩子为空则将空的右孩子指针域改为指向其后继。 ———— 这种改变指向的指针称为“线索”。加上线索的二叉树称为线索二叉树(Threaded Binary Tree)

  • 对二叉树按某种遍历次序使其变为线索二叉树的过程叫线索化

线索二叉树

  • 为了区分 lchild 和 rchild 指针到底是指向孩子的指针,还是指向前驱或者是后继的指针,对二叉链表中的每个结点增设两个标志域 ltag 和 rtag ,并约定:

    ltag = 0 lchild 指向该结点的左孩子

    ltag = 1 lchild 指向该结点的前驱

    ltag = 0 lchild 指向该结点的右孩子

    ltag = 1 lchild 指向该结点的后继

  • 线索二叉树结构:

      typedef struct BiThrNode{
          int data;
          int ltag,rtag;
          struct BiThrNode *lchild,*rchild;
      }BiThrNode,*BiThrTree;
    

    线索二叉树结构

    先序二叉树

    中序线索二叉树

    后序线索二叉树

  • 增设一个头结点:

    头结点的ltag = 0, lchild 指向根结点,rtag = 1,rchild指向遍历序列中的最后结点,遍历序列中第一个结点的lc域和最后一个结点的lc域都指向头结点。

    头结点

posted @ 2023-02-27 22:16  凉白茶  阅读(81)  评论(0编辑  收藏  举报