8

Similar documents
PowerPoint Presentation

6

7

PowerPoint Presentation

204 */ InitiateStack s ; /* s */ i = n; t = p = new node; /* */ p->data = postorder[i]; while i > q = new node; if parent[i - ] == postorder[i] S,T S

数据结构

幻灯片 1

Microsoft PowerPoint - 6-.pptx

2


Microsoft PowerPoint - Lecture9.ppt

四 读算法 ( 每题 7 分, 共 14 分 ) 1. (1) 查询链表的尾结点 (2) 将第一个结点链接到链表的尾部, 作为新的尾结点 (3) 返回的线性表为 (a 2,a 3,,a n,a 1 ) 2. 递归地后序遍历链式存储的二叉树 五 法填空 ( 每空 2 分, 共 8 分 ) true B

6 tree

Microsoft PowerPoint - 06.ppt

4

13

PowerPoint 演示文稿

馬偕醫學院 學生事務工作簡報

试卷代号 : 座位号 CD 中央广播电视大学 学年度第二学期 " 开放本科 " 期末考试 数据结构 ( 本 ) 试题 I 题号 - - I 二 l 三 l 四 l 总 分 分数 I I I I I I 2009 年 7 月 得分 评卷人 I I I 一

6.1 树的定义和基本术语 6.2 二叉树 ( 定义 性质 存储结构 ) 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.5 赫夫曼树及其应用

《C语言程序设计》第2版教材习题参考答案

试卷代号 : 座位号 I II 中央广播电视大学 学年度第二学期 " 开放本科 " 期末考试 数据结构试题 2011 年 7 月! 题号 I - I 二 三 四! 五! 六 总分 分数 I I I 1 1- I ---1 I 得分 评卷人 一 单项选择

ebook14-4

18

没有幻灯片标题

<4D F736F F F696E74202D20536C FB5DACBC4D5C220CAF7D3EBB6FEB2E6CAF7205BBCE6C8DDC4A3CABD5D>

《C语言程序设计》教材习题参考答案

穨_1_.PDF

标题

目 录 一 重 要 提 示... 3 二 公 司 主 要 财 务 数 据 和 股 东 变 化... 3 三 重 要 事 项... 8 四 附 录 / 28

立 志 于 打 造 最 贴 近 考 生 实 际 的 辅 导 书 计 算 机 考 研 之 数 据 结 构 高 分 笔 记 率 辉 编 著 周 伟 张 浩 审 核 讨 论 群 :

chap07.key

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

第六章 树

运用伸展树解决数列维护问题

二、文选

苏教高〔2005〕 号

什么是函数式编程?

新 竹 市 都 市 計 畫 委 員 會 第 233 次 會 議 紀 錄 壹 時 間 :102 年 8 月 28 日 ( 星 期 三 ) 上 午 9 時 30 分 貳 地 點 : 本 府 第 一 會 議 室 參 主 持 人 : 許 主 任 委 員 明 財 肆 出 席 委 員 : 詳 簽 到 簿 伍 列

untitled

Microsoft Word - 第三章第一節第二節.doc

生成word文档

PowerPoint 演示文稿

公開徵求廠商提供「採購專業人員訓練計畫企劃書」公告

untitled

untitled

天仁期末個人報告1.PDF

untitled

第七章数组 掌握一维数组的定义 初始化及元素引用 ; 掌握二维数组的定义 初始化及元素引用 ; 掌握字符数组的定义及使用 ; 4. 了解字符串处理函数 ; 第八章函数 掌握函数的定义与调用 ; 掌握函数调用时的实参与形参的结合 ; 理解函数原型声明与函数在源程序中的相对位置的关系 ; 理解函数的嵌套

<4D F736F F D20BBAAC4CFC0EDB9A4B4F3D1A72020CAFDBEDDBDE1B9B9B8B4CFB0B1CABCC7D5FBC0ED2E646F63>

- 2 -

校园之星

Open topic Bellman-Ford算法与负环

湖北工业大学二 八年招收硕士学位研究生试卷 则从顶点 A 出发进行深度优先遍历可以得到的序列是 : A.ACEDBFG B.ACDGFBE C.AECDBGF D.ABDGFEC 9 在对 n 个元素的序列进行排序时, 堆排序所需要的附加存储空间是 ( ) A. O(log 2 n) B. O(1)

PowerPoint 演示文稿

Microsoft PowerPoint - DS_Ch6.ppt [兼容模式]

2.3 链表

ac2017-joeyguo-2.0.key

Microsoft PowerPoint - DS_Ch2.ppt [兼容模式]

Microsoft Word - 专升本练习5:图.doc

Qcon北京2018-《唯快不破——高效定位线上 Node.js 应用内存泄漏》-黄一君

PowerPoint Presentation

Microsoft PowerPoint - DS_Ch5.ppt [兼容模式]

《垓下歌》 項羽

2.??,,,,, ;,,,,,,,, 3.?,,?,?,

宜蘭縣風景區管理所五峰旗風景特定風景區開放行動咖啡車作業投標須知

第 二 十 七 章 一 夜 苦 熬 第 二 十 八 章 租 房 同 居 第 二 十 九 章 二 人 世 界 第 三 十 章 取 消 面 试 第 三 十 一 章 中 暑 卧 床 第 三 十 二 章 找 到 工 作 第

玻璃幕墙工程质量检验标准 JGJ/T

玻璃幕墙工程质量检验标准 JGJ/T

2


报 告 简 要 丽 江 古 城 位 于 云 南 省 西 北 部, 始 建 于 宋 末 元 初 古 城 西 北 方 30 公 里 处 是 海 拔 5596 米 的 玉 龙 雪 山 及 第 四 世 冰 川 遗 迹 丽 江 古 城 在 南 宋 时 期 就 初 具 规 模, 已 有 八 九 百 年 的 历

有 不 良 企 图 时, 就 要 立 即 躲 开 他 当 你 实 在 难 以 分 辨 对 方 是 真 心 实 意 还 是 虚 情 假 意 时, 可 向 父 母 老 师 或 周 围 较 成 熟 和 亲 近 的 朋 友 请 教, 请 他 们 帮 你 分 析 情 况, 做 出 判 断 此 时, 拒 绝 帮

內 容 及 試 題 範 例 術 科 評 量 規 範 評 分 標 準 一 (, 工 具 與 材 料 由 本 校 提 供, 考 生 無 須 自 備 ) ( 一 ) 基 本 焊 接 工 具 操 作 及 辨 識 基 本 手 工 具 設 備 ( 二 ) 測 驗 時 間 50 分 鐘 ( 三 ) 工 具 與 材

交 通 部 公 路 總 局 新 竹 區 監 理 所 104 年 第 2 次 契 約 服 務 員 甄 試 試 場 序 號 試 場 序 號 姓 名 A01 A02 A03 A04 A05 A06 A07 A08 A09 A10 A11 A12 A13 A14 A15 A16 張 齡 文 王 美 蕙 吳

美 国 研 究


Microsoft Word - 专升本练习2:线性表.doc

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

untitled

lecture11

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

CC213

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

试卷代号 : 座位号 中央广播电视大学 学年度第二学期 " 开放本科 " 期末考试 数据结构试题 2012 年 7 月 题号一四五总分一一 分数 得分 评卷人 - 单项选择题, 在括号内填写所选择的标号 { 每小题 2 分, 共 1 8 分 ) 1. 下面算法

1

数 6-树.ppt

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

980105

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

Microsoft Word - 数据结构实训与习题725xdy.doc

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料


<4D F736F F D B8BDBCFE4220D7A8D2B5BBF9B4A1D3EBBACBD0C4BFCEB3CCC3E8CAF62E646F6378>

Two Mergeable Data Structures


<4D F736F F D20B9E3B6ABB9E3D1C5D6D0D1A7B8B0C8D5BFC6BCBCBDBBC1F7BFBCB2ECB1A8B8E6>

BBS mm $^%*^&_$^$&%*

无类继承.key

勤 學 * 卓 越 * 快 樂 成 長 本 校 在 老 師 群 策 群 力 共 同 討 論 下, 型 塑 了 學 校 願 景 : 勤 學 卓 越 快 樂 成 長 ( 一 ) 勤 學 運 用 真 的 力 量 培 養 勤 學, 以 語 文 教 為 基 礎 紮 根 ( 二 ) 卓 越 利 用 美 的 感

Transcription:

孙猛 http://www.math.pku.edu.cn/teachers/sunm 2017 年 10 月 26 日 1

树及其抽象数据类型 树的实现 树林林 2

树的 几种不不同表现形式 3

4

html head body meta title h1 ul h2 li li a 5

树是 n(n 0) 个结点的有限集 T,T 非空时满 足 : 有且仅有 一个特殊的称为根 (root) 的结点 r; 除根结点外, 其余结点可分为 m(m 0) 个互不不相交的 非空有限集 T 1,T 2,,T m, 其中每个集合 又是 一棵 非空树, 称为 r 的 子树 (subtree) 关于 子树 结点数为 0 的树称为空树 一棵 非空树可以没有 子树 (m=0), 即这棵树只包含 一个根结点 如有 子树, 则 子树 非空 6

空树 父结点 子结点 路路径 路路径 长度 结点的度数 树的度数 无序树 有序树 结点的次序 最左 子结点 长 子 次 子 右兄弟 7

ADT Tree is operations Tree createemptytree(void); Tree constree(node p, Tree t1, Tree ti); int isnull(tree t); Node root(tree t); Node parent(node p); Tree leftchild(tree t); Tree rightsibling(tree t); End ADT Tree 8

深度优先周游 : 先根次序 :A B D E I J F C G H 后根次序 :D I J E F B G H C A 广度优先周游 : 能否确定树结构? 如何确定? A B C D E F G H I J B C A D E F G H I J 9

/* 按先根次序周游树的递归算法 */ void preorder(tree t) { Tree c; if (t==null) return; visit( root(t) ); c = leftchild ( t ); while (c!=null) {preorder ( c ); c = rightsibling ( c ); } } 10

void npreorder ( Tree t ) { Tree c = t; Stack s = createemptystack ( ); /* 栈元素的类型是 Tree */ do{ while ( c!=null ) { visit ( root(c) ); push ( s, c ); c = leftchild ( c ); } while ((c==null)&&(!isemptystack(s))) { c = rightsibling(top(s)); pop(s); } } while(c!=null); } 11

/* 按后根次序周游树的递归算法 */ void postorder( Tree t ) { Tree c; if (t==null) return; c = leftchild ( t ); while (c!=null) { postorder ( c );c = rightsibling ( c ); } visit(root(t) ); } 12

void levelorder(tree t) { Tree c; } Queue q; /* 队列元素的类型为 Tree */ q = createemptyqueue(); c =t; if (c==null) return; enqueue(q,c); while (!isemptyqueue(q)) { c = frontqueue(q); dequeue(q); visit( root(c) ); c = leftchild( c ); while (c!=null){ enqueue(q,c); c = rightsibling( c ); } } 13

子结点表示法 父指针表示法 子表表示法 长 子- 兄弟表示法 14

树的最基本表示 方法是 子结点表示法, 其基本设计与 二叉树的左右指针表示法类似 : 用 一个数据单元表示结点, 通过结点间的指针表示树结构 在 m 度结点表示的 n 个结点的树中, 恰有 n (m 1)+1 个空树引 用域 15

树中除根以外的每个结点都有唯 一的 一个 父结点 根据这 一特性, 可 用 一组连续的存储空间, 即 用 一个顺序表存储树中的各个结点 表中的每个元素包括结点本身的信息以及本结点的 父结点在表中的下标 16

结点的结构可定义为 : struct ParTreeNode{ DataType info; /* 结点中的元素 */ int parent; /* 结点的 父结点位置 */ }; 树的类型定义为 : struct ParTree{ int MAXNUM; /* 树中最 大结点个数 */ int n; /* 树中已有结点的个数 */ struct ParTreeNode * nodelist; /* 存放树中结点的数组 */ }; typedef struct ParTree * PParTree; / 树类型的指针类型 */ 17

问题 : 1) 求结点的 子结点和兄弟就需要查询整个表 2) 没有表示出结点之间的左右次序, 无法求树中某个指定结点的最左 子结点和右兄弟结点等基本运算 改进 方法是按 一种周游次序在表中存放结点, 其中较常 见的 一种 方法是依次存放树的先根序列列 18

A B C D E F G H I J info parent 0 A -1 1 B 0 2 D 1 3 E 1 4 H 3 5 I 3 6 J 3 7 C 0 8 F 7 9 G 7 19

/* 在 父指针表示的树中求右兄弟结点的位置 */ int rightsibling_partree(ppartree t, int p) { int i; if (p>=0 && p<t->n) for (i=p+1;i<t->n;i++) if (t->nodelist[i].parent==t->nodelist[p].parent) return i ; return -1; } /* 在 父指针表示的树中求最左 子结点的位置 */ int leftchild_partree(ppartree t, int p) { if (t->nodelist[p+1].parent==p) return(p+1); else return -1 ; } 20

父指针表示 方法的主要优点是存储空间 比较节省, 对 求某个结点的 父 母和求某个结点的最左 子结点操作都 很 方便便, 但是对求某个结点的右兄弟运算 比较慢 21

把整棵树表示成 一个结点表 结点表中的每个元素 又包含 一个表, 它记录了了这个结点的所有 子结点的位置, 称为 子表 ( 或者称为边表 ) 结点表的 长度即树中结点的个数, 一般 用 一维数组顺序存储 ; 结点表中除了了要保存元素本身的信息外, 还要保存 子表的表头链接 而 子表的 长度依赖于各结点的度数, 所以各不不相同, 一般 用单链表表示 ; 子表中结点的链接顺序是按其在树中从左到右的次序进 行行的 22

23

struct EdgeNode { /* 子表中结点的结构 */ int nodeposition; /* 子结点在结点表中的位置 */ struct EdgeNode *link; /* 指向下 一个 子表中的结点 */ }; struct ChiTreeNode { /* 结点表中结点的结构 */ DataType info; /* 结点本身的信息 */ struct EdgeNode *children; /* 本结点 子表的头指针 */ }; 24

struct ChiTree { /* 树结构 */ int MAXNUM /* 树中最 大结点个数 */ int root; /* 根结点的下标 */ int n; /* 实际结点个数 */ struct ChiTreeNode * nodelist; /* 结点表 */ }; typedef struct ChiTree * PChiTree; 25

与 父指针表示法类似, 通常树结点表中的结点也按某种遍历序排列列 由于还有 子结点表, 通过它们可以直接找到相关 子结点, 各种找 子结点的操作 ( 求最左 子结点 找全部 子结点等 ) 实现都 比较 方便便 但求某个结点的 父结点和右兄弟实现起来 比较费事, 因为要找某结点的 父结点必须依次检查哪个结点的 子表中是否包含该结点, 而要找某结点的右兄弟时, 则 首先要找到其 父结点, 然后再从 父结点的 子表中找寻它的右兄弟结点 26

int parent_chitree(pchitree t, int p) { int i; struct EdgeNode *v; for (i=0;i<t->n;i++) { } } /* 逐个检查树的各个结点, 是不不是 父结点 */ v=t->nodelist[i].children; /* 若检查的结点 子表中有 p, 则返回值是该结点的位置 */ while (v!=null) if (v->nodeposition==p) return i ; else v=v->link; return(-1); /* 无 父结点, 则返回值为 -1 */ 27

int rightsibling_chitree(pchitree t, int p) { int i; struct EdgeNode *v; for (i=0;i<t->n;i++){ v = t->nodelist[i].children; while (v!=null) if (v->nodeposition==p) if (v->link==null)return(-1); else return(v->link->nodeposition); else v=v->link; } return(-1); } 28

在这种存储结构中, 类型定义如下 : struct CSNode; /* 树中结点结构 */ typedef struct CSNode * PCSNode; /* 结点的指针类型 */ struct CSNode { /* 结点结构定义 */ DataType info; /* 结点中的元素 */ PCSNode lchild; /* 结点的最左 子结点的指针 */ PCSNode rsibling; /* 结点的右兄弟的指针 */ }; typedef struct CSNode * CSTree; /* 树类型定义 */ 29

A t A B C D E F G H I J D B F E C G H I J 30

采 用 长 子 - 兄弟表示法表示树时, 除找 父结点和从 子树构造树之外, 其余的基本运算实现起来都是 比较简单的 甚 至可以 用 一个简单的表达式或赋值语句句代替函数调 用 找结点的全部 子结点也很容易易 : 先找到 长 子, 再由 子结点的 rsibling 字段逐个地找 子结点的右兄弟 长 子 - 兄弟表示法的缺点是寻找某个指定结点的 父结点 比较麻烦, 需要对树进 行行周游, 周游时检查被访问的结点的各个 子结点的位置是不不是指定结点 31

树林林是由零个或多个不不相交的树所组成的集合 树林林中所有树也是有序的, 彼此称为兄弟 与 自然界的树林林有所不不同, 这 里里的树林林可以是 一个空集, 也 可以只由 一棵树构成 如果从 一棵树中将根结点 ( 连同根结点到各 子结点的边 ) 删除, 便便得到 一个树林林 32

先根次序周游 : 首先访问树林林中第 一棵树的根结点 ; 然后先根次序周游第 一棵树除去根结点剩下的所有 子树构成的树林林 ; 最后先根次序周游除去第 一棵树之后剩下的树林林 后根次序周游 : 首先后根次序周游第 一棵树的根结点的所有 子树构成的树林林 ; 然后访问树林林中第 一棵树的根结点 ; 最后后根次序周游除去第 一棵树之后剩下的树林林 33

前 面所有树的表示 方法都可以推 广到树林林 下 面给出 用这些 方法表示 一个树林林的例例 子 34

35

36

37

在树林林 ( 包括树 ) 与 二叉树之间有 一个 自然的 一 一对应 的关系 任何树林林都唯 一地对应到 一棵 二叉树 ; 任何 二叉树也都唯 一地对应到 一个树林林 38

39

首先在所有相邻的兄弟结点之间加 一条线 ; 然后对每个 非终端结点, 只保留留它到其最左 子结点的连线, 删去它与其它 子结点之间原有的连线 ; 最后以根结点为轴 心, 将整棵树顺时针旋转 一定 角度 ( 如 45 度 ), 使其层次分明 40

把树林林 F 看作树的序列列 :F = T 1,T 2,,T n, 对构造应于 F 的 二叉树 B(F) 的定义可以递归描述如下 : 若 n = 0, 则 B(F) 为空 ; 若 n>0, 则 B(F) 的根是 T 1 的根 w 1, B(F) 的左 子树是 B(T 11,T 12,,T 1m ), 其中 T 11,T 12,,T 1m 是 T 1 的 子树 ; B(F) 的右 子树是 B(T 2,,T n ) 41

42

(1) 若某结点是其 父 母的左 子结点, 则把该结点的右 子 结点, 右 子结点的右 子结点, 都与该结点的 父 母 用 ( 虚 ) 线连起来 ; (2) 去掉原 二叉树中所有 父 母到右 子结点的连线 ; 整理理由 (1) (2) 两步所得到的树或树林林, 使之结构层次 分明 43

设 B 是 一棵 二叉树,r 是 B 的根,L 是 r 的左 子树,R 是 r 的右 子树, 则构造对应于 B 的树林林 F(B) 可作如下严格的递归描述 : 若 B 为空 二叉树, 则 F(B) 是空的树林林 ; 若 B 不不为空 二叉树, 则 F(B) 是 一棵树 T1 加上树林林 F(R), 其中树 T1 的根为 r,r 的 子树为 F(L) 44

树是 一种常 见的树形结构, 它常 用的存储表示有四种 : 子结点表示法 父结点表示法 子表表示法和 长 子 - 兄弟表示法 周游是树上的重要操作, 主要有深度优先和 广度优先两种 方式, 在深度优先中 又分为先根次序周游和后根次序周游 由于树 / 树林林与 二叉树之间存在对应关系, 所以常常把树与树林林转换为 二叉树处理理 这使得 二叉树的讨论和它的 llinkrlink 表示更更加重要 二叉树和树的各种存储 方式都应该包 ( 隐 ) 含所有的结点和结点之间关系的信息, 不不同的表示原则上应该可以相互转换 45