贵州民族学院数据结构课件 第八章.pptVIP

  • 2
  • 0
  • 约1.42万字
  • 约 10页
  • 2019-05-06 发布于广东
  • 举报
第八章 树形结构的存储 第八章 树形结构的存储 8.1 链式存储 8.2 穿线树 8.3 顺序存储 8.1 链式存储 1. lchild-rchild表示(二叉链表) 结点的存储方式:对于二叉树的每个结点 存储结点数据 设置两个指针字段lchild和rchild,分别指向本结点的左、右子树 若其中某棵子树为空,则相应的指针为空 结点形式: 设置指针T,指向根结点。当二叉树空时,T=nil。由于T可唯一标识一棵二叉树,我们常称“二叉树T” C语言描述的二叉链表 8.1 链式存储 2. 三重链表 3. 孩子兄弟表示法 一个结点由三个字段组成: 数据字段:数据元素的值 孩子链字段:指向该结点的第一个(左)孩子 兄弟链字段:指向该结点的下一个兄弟 7.2 穿线树(线索树) 定义: 前驱与后继:在二叉树的先序、中序或后序访问序列中两个相邻的结点互称为前驱与后继 线索:指向前驱或后继结点的指针 穿线二叉树:加上线索的二叉链表表示的二叉树 线索化:对二叉树按某种遍历次序使其变为穿线二叉树的过程 注:线索化总是针对一种周游方法的 二叉链表表示的二叉树 中序线索化一棵二叉树 typedef struct node { datatype data; struct node *lc, *rc; } BTNode, *BTree; 算法思想:设有二叉链表表示的二叉树T,对T用中序游周,当遇结点的左(右)孩子链域为空时,增加线索: 左孩子链域——指向前趋 右孩子链域——指向后继 BTree T,p,pr; Stack s;其中,s是一个顺序栈,p指向当前访问的结点,pr指向*p的前趋 算法T[中序线索化二叉树] T1[置初值] p←T, pr←nil T2[按中序访问各结点,必要时加线索]反复执行下列各步,直到所有结点访问完 T2.1[找树p按中序周游的第一个结点] 当p≠nil时,反复执行: push(s,p), p←p→lc T2.2[周游完,算法结束,否则做穿线处理] 若s空,则算法结束,T是穿线二叉树;否则 (1)top(s,p),pop(s) (2) 若pr≠nil则 a)若pr→rc=nil,则pr→rc←-p b)若p→lc=nil,则p→lc←-pr (3)pr←p,p←p→rc C实现 在有n个结点的二叉链表中必定有n+1个空链域 在线索二叉树的结点中增加两个标志字段 lt:若 lt =0, lc 指向左孩子;若 lt=1, lc指向其前驱 rt:若 rt =0, rc 指向右孩子;若 rt=1, rc指向其后继 结点定义: 算法 按中序遍历并线索化二叉树Thrt (1)为二叉树 t 建立头结点,Thrt指向头结点 void InOrdTrv_Thr(BThrTr T){ //中序遍历二叉线索树T的非递归算法:输出每个数据元素 //T指向头结点,头结点的左链域lc指向T的根结点 BThrTr p;//p指向当前要访问的结点 p=T-cl; //p指向根结点 while(p!=T){ // p==T时,空树或遍历结束 while(p-lt==0) p=p-lc; //找左链尾 printf(“%c”,p-data); //访问p指向的结点 while(p-rt==1p-rc!=T){ p=p-rc; printf(“%c”,p-data); //访问上一结点的后继 } p=p-rc; } //while } //InOrderTrv_Thr 算法 在中序线索二叉树的指定结点后插入新结点 例如,在T中结点*p后插入结点*r 8.3 顺序存储 1、二叉树的顺序存储 实现:按完全二叉树的结点层次编号,在数组中依次存放二叉树中的结点,i号结点存放在第i个分量中 特点: 结点间关系蕴含在其存储位置中 浪费空间,适于存满二叉树和完全二叉树 2、双亲表示法 实现:定义结构体顺序表存放树的结点,每个结点含两个字段: 数据字段:存放结点本身信息 双亲字段:指示本结点的双亲结点在顺序表中位置 特点:找双亲容易,找孩子难 2、双亲表示法 typedef struct { datatype data; int parent; } Tnode; typedef Tnode SqTree[M]; 3、孩子表示法 实现:定义结构体顺序表存放树的结点

文档评论(0)

1亿VIP精品文档

相关文档