数据结张构第14讲-线索树与树和森林-c.pptVIP

  • 0
  • 0
  • 约6.99千字
  • 约 46页
  • 2018-12-25 发布于福建
  • 举报

数据结张构第14讲-线索树与树和森林-c.ppt

数据结张构第14讲-线索树与树和森林-c

6.3.2 线索二叉树 1.何谓线索二叉树? 遍历结果是求得结点的一个线性序列。指向该线性序列“前驱”和“后继”的指针,称“线索”;包含“线索”的存储结构,称为“线索链表”;与其相应的二叉树,称为“线索二叉树”;对二叉树以某种次序遍历,使其变为线索二叉树的过程,称为“线索化”。 2.线索链表中结点的结构 在二叉链表的结点结构中增加两个标志域,并规定: 二叉树二叉线索存储表示 typedef enum { Link, Thread } PointerThr; // Link==0:指针,Thread==1:线索 typedef struct BiThrNode{ TElemType data; Struct BiThrNode *lchild, *rchild; // 左右孩子指针 PointerThr LTag, RTag; // 左右标志 } BiThrNode, *BiThrTree; 如何在线索树中找结点的后继? 如何在线索树中找结点的前驱? 4.如何建立线索化链表? 由于线索化的实质是将二叉链表中的空指针改为指向前驱或后继的线索,而前驱或后继的信息只有在遍历时才能得到,因此线索化的过程即为在遍历的过程中修改空指针的过程。 对二叉链表p进行中序线索化的递归算法(带头结点) Status InOrderThreading(BiThrTree Thrt,BiThrTree T) 步骤: 对二叉链表p进行中序线索化的递归算法(不带头结点) void InThreading(BiThrTree p){  if (p){   InThreading(p-lchild); //左子树线索化   if (!p-lchild){ p-lchild=pre; p-ltag=Thread;} //前驱线索   if (!pre-rchild){pre-rchild=p;pre-rtag=Thread;} //后继线索 pre = p; //保持pre指向p的前驱 InThreading(p-rchild);   //右子树线索化 } }InThreading  Status InOrderThreading(BiThrTree Thrt,BiThrTree T){ //中序遍历二叉树T,并将其中序线索化,Thrt指向头结点。 Thrt=(BiThrTree)malloc(sizeof(BiThrNode)); if (!Thrt) exit(OVERFLOW); Thrt-ltag=Link; Thrt-rtag=Thread; //建立头结点 Thrt-rchild=Thrt; if (!T) Thrt-lchild=Thrt; //空树,左指针回指自身 else{ //二叉树不为空树,进行线索化 Thrt-lchild=T; //头结点的lchild指向二叉链表根   pre=Thrt; //pre指向前驱结点 InThreading(T); //中序线索化二叉链表T pre-rchild=Thrt; pre-rtag=Thread; //最后一个结点线索化 Thrt-rchild=pre; } return OK; } Status InOrderThreading(BiThrTree Thrt,BiThrTree T){ Thrt=(BiThrTree)malloc(sizeof(BiThrNode));  if (!Thrt) exit(OVERFLOW); Thrt-ltag=Link; Thrt-rtag=Thread; Thrt-rchild=Thrt; if (!T) Thrt-lchild=Thrt; //空树,Thrt回指自身 else{ Thrt-lchild=T;//头结点的lchild指向二叉链表根 pre=Thrt; //pre指向前驱结点 InThreading(T); //中序线索化二叉链表T pre-rchild=Thrt; pre-rtag=Thread; //最后一个结点线索化 Thrt-rchild=pre; } return OK; } 6.4.1 树的存储结构 三种常用的链表结构: 双亲表示法 孩子表示法 孩子兄弟表示法 6.4.2 森林和二叉树的转换 1. 树和二叉树的对应关系

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档