




已阅读5页,还剩105页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
了解树型结构结点之间的层次关系 掌握树和二叉树的定义及其相关的术语 重点掌握二叉树的结构 性质 存储表示和四种遍历算法 掌握二叉树线索化的实质及线索化的过程 了解树的结构性质 存储表示方法和遍历算法 掌握森林 树 与二叉树的对应关系和相互转换方法 教学要求 线性表 元素之间的线性关系树 元素之间的层次关系 3 1基本术语 定义一 1 一个结点x组成的集 x 是一棵树 Tree 这个结点x也是这棵树的根 2 假设x是一个结点 D1 D2 Dk是k棵互不相交的树 我们可以构造一棵新树 令x为根 并有k条边由x指向树D1 D2 Dk 这些边也叫做分支 D1 D2 Dk称作根x的树之子树 SubTree 定义二 树是n 0 个结点的有限集 在任意一棵非空树中 1 有且仅有特定的称为根 Root 的结点 2 当n 1时 其余结点可分为k 0 个互不相交的有限集D1 D2 Dk 其中每一个集合本身又是一棵树 并且称为根的子树 SubTree 1 树的定义 T D R D 具有相同类型的数据元素的集合 R 若D为空集 则称为空树 若D仅含一个数据元素 则R为空集 否则R H H是如下的二元关系 1 在D中存在唯一的称为根的数据元素root 它在关系H下无前驱 2 若D root 则存在D root 的一个划分D1 D2 Dk k 0 对任意j l 1 j l k 有Dj Dl 对任意的i 1 i k 唯一存在数据元素xi Di 有 H 3 对应于D root 的划分 H 有唯一的一个划分H1 H2 Hk k 0 对任意j l 1 j l k 有Hj Hl 且对任意的i 1 i k Hi是Di上的二元关系 Di Hi 是一棵符合本定义的树 称为根root的子树 定义三 三个定义的共同点 1 相同类型的元素构成的集合 2 特定的结点 根 3 除了根之外 组成k个划分 且互不相交 4 每一个划分又是一棵树 递归 几点说明 递归定义 但不会产生循环定义 构造性定义便于树型结构的建立 一株树的每个结点都是这株树的某株子树的根 2 常用术语 分支路长 父亲双亲儿子兄弟子孙祖先 层结点的高树的高 深度 有序树 无序树 森林forest 是n 0棵互不相交的树的集合 定义二 BinaryTree D R D 指数据对象 是由相同类型的数据元素组成的集合 R 为数据元素间的关系 若D 则R 称Binarytree为空树 若D 则R H H是如下二元关系 在D中存在唯一的称为根的数据元素root 它在关系H下无前驱 若D root 则存在D root Dl Dr 且Dl Dr 若Dl 则Dl中存在唯一的元素xl H 且存在Dl上的关系Hl H 若Dr 则Dr中存在唯一的元素xr H 且存在Dr上的关系Hr H H Hl Hr Dl Hl 是符合本定义的二叉树 称为根的左子树 Dr Hr 是符合本定义的二叉树 称为根的右子树 与树的定义对比 1 相同类型的元素构成的集合 2 特定的结点 根 3 除了根之外 组成k个划分 且互不相交 4 每一个划分又是一棵二叉树 递归 k 2分左 右二叉树是有序的 分析图 1 和图 2 的区别 问题 具有三个结点的树和二叉树各有多少棵 2 二叉树的性质 性质1 在二叉树中第i层的结点数最多为2i 1 i 1 性质2 高度为k的二叉树其结点总数最多为2k 1 k 1 性质3 对任意的非空二叉树T 如果叶结点的个数为n0 而其度为2的结点数为n2 则 n0 n2 1 定义 深度为k且有2k 1个结点的二叉树称为满二叉树 层序编号 对满二叉树的结点进行连续编号 从根结点开始 从上而下 自左至右 定义 深度为k的 有n个结点的二叉树 当且仅当其每个结点都与深度为k的满二叉树中编号从1至n的结点一一对应 称之为完全二叉树 二叉树的性质 续 性质4具有n个结点的完全二叉树的深度为 log2n 1 3 二叉树的遍历 遍历 根据原则 按照一定的顺序访问二叉树中的每一个结点 使每个结点只能被访问一次 根 D 左孩子 L 和右孩子 R 三个结点可能出现的顺序有 DLR DRL LDR LRD RLD RDL 原则 左孩子结点一定要在右孩子结点之前被访问 要讨论的三种操作分别为 先根顺序DLR 中根顺序LDR 后根顺序LRD 先根顺序遍历二叉树 若二叉树非空则 访问根结点 先根顺序遍历左子树 先根顺序遍历右子树 中根顺序遍历二叉树 若二叉树非空则 中根顺序遍历左子树 访问根结点 中根顺序遍历右子树 后根顺序遍历二叉树 若二叉树非空则 后根顺序遍历左子树 后根顺序遍历右子树 访问根结点 3 2 2抽象数据型二叉树 ADT操作 Empty BT IsEmpty BT CreateBT V LT RT Lchild BT Rchild BT Data BT 例3 1 写一个递归函数 按先根顺序列出二叉树中每个结点的Data域之值 VoidPreOrder BT BTREEBT if IsEmpty BT visit Data BT PreOrder Lchild BT PreOrder Rchild BT 例3 2 写一个递归函数 按中根顺序列出二叉树中每个结点的Data域之值 VoidInOrder BT BTREEBT if IsEmpty BT InOrder Lchild BT visit Data BT InOrder Rchild BT 例3 3 写一个递归函数 按后根顺序列出二叉树中每个结点的Data域之值 VoidPostOrder BT BTREEBT if IsEmpty BT PostOrder Lchild BT PostOrder Rchild BT visit Data BT 例 二叉树的遍历的非递归过程 先序 ABDJHECFIGKLM中序 JDHBEAFICGLKM后序 JHDEBIFLMKGCA VoidInOrder BT BTREEBT if IsEmpty BT InOrder Lchild BT visit Data BT InOrder Rchild BT 算法 Loop if BT非空 进栈 左一步 else 退栈 输出 右一步 数据结构 设栈S 用以保留当前结点 二叉树的遍历的非递归过程 VoidNInOrder BT BTREEBT STACKS BTREET MakeNull S T BT while IsEmpty T Empty S if IsEmpty T Push T S T Lchild T else T TOP S POP S visit Data T T Rchild T 进栈 左走一步 退栈 右走一步 先序遍历非递归算法 Loop if BT非空 输出 进栈 左一步 else 退栈 输出 右一步 中序遍历非递归算法 Loop if BT非空 进栈 左一步 else 退栈 输出 右一步 后序遍历非递归算法 Loop if BT非空 进栈 左一步 else 当栈顶指针所指结点的右子树不存在或已访问 退栈并访问 否则右一步 中序遍历非递归算法 voidInOrder BTREE root BTREE stack MAX inttop 0 do while root Null top if top MAX printf 栈满 n elsestack top root root Lchild root if top 0 root stack top top printf c Data root root Rchild root while top 0 root Null Loop if BT非空 输出 进栈 左一步 else 退栈 右一步 先序遍历非递归算法 voidPreOrder BTREE root BTREE stack MAX inttop 0 do while root Null printf c Data root top if top MAX printf 栈满 n elsestack top root root Lchild root if top 0 root stack top top root Rchild root while top 0 root Null Loop if BT非空 进栈 左一步 else 退栈 输出 右一步 后序遍历非递归算法 voidPostOrder BTREE root 后序遍历 非递归 BTREE stack MAX p inttop 0 b do while root Null top if top MAX printf 栈满 n elsestack top root root Lchild root p Null b 1 while top 0 Loop if BT非空 进栈 左一步 else 当栈顶指针所指结点的右子树不存在或已访问 退栈并访问 否则右一步 3 2 3二叉树的表示 1 顺序存储 1 完全 或满 二叉树 根据性质5 如已知某结点的层序编号i 则可求得该结点的双亲结点 左孩子结点和右孩子结点 采用一维数组 按层序顺序依次存储二叉树的每一个结点 如下图所示 2 一般二叉树 根据性质5 如已知某结点的层序编号i 则可求得该结点的双亲结点 左孩子结点和右孩子结点 然后检测其值是否为虚设的特殊结点 通过虚设部分结点 使其变成相应的完全二叉树 StructNode StructNode lchild StructNode rchild datatypedata TypedefstructNode BTREE 2 二叉树的左右链表示 例 P102 BTREECreateBT v ltree rtree datatypev BTREEltree rtree BTREEroot root NewNode root data v root lchild ltree root rchild rtree returnroot 证明 n个结点的二叉树中 共有n 1个空链接域 证 设其空链域数为x分支数B入 n 1B出 2 n x B入 B出 n 1 2 n x得出x n 1 结点总数 13空链域的个数 14 例3 4 二叉树建立方法之一按先序序列建立二叉树的左右链结构 如下图所示二叉树 输入 ABDH I E CF J G 其中 表示空 BTREE Setup2 BTREE bt charch fflush stdin scanf c 例3 5 二叉树的遍历 二叉链表结构 VoidPreOrder BTREET if T visit T data PreOrder T lchild PreOrder T rchild VoidInOrder BTREET if T InOrder T lchild visit T data InOrder T rchild VoidPostOrder BTREET if T PostOrder T lchild PostOrder T rchild visit T data 例3 6 按层序遍历二叉树 二叉链表结构 从二叉树的第一层开始 直到最后一层 每层从左到右访问每一个结点 是的每个结点只能被访问一次 右图所示二叉树按层序遍历结果为 ABCDEFGHIJ 设立一个队列 队列元素为结点的指针 首先将根结点指针排队 当队列非空时 从队首删除一个结点 如果该结点的左子树非空 则其左子树结点指针指针排队 如果该结点的右子树非空 则其右子树结点指针指针排队 重复上述过程 直到队列为空 Q front rear Structnode Structnode lchild Structnode rchild datatypedata Typedefstructnode BTREE VoidLeverList BTREET QUEUEQ BTREEp T MakeNull Q if T EnQueue p Q while Empty Q p DeQueue Q visit P data if p lchild EnQueue p lchild if p rchild EnQueue p rchild StructQUEUE Structnode data maxlength intfront intrear 例3 7 一棵二叉树的先序 中序和后序序列分别如下 其中一部分未显示出来 试求出空格处的内容 并画出该二叉树 先序 B F ICEH G 中序 D KFIA EJC 后序 K FBHJ G A 例3 8 二叉树中序序列为 ABCEFGHD 后序序列为 ABFHGEDC 请画出此二叉树 已知 已知先序和中序 已知中序和后序 已知先序和后序 能否唯一还原二叉树 例3 10 完全二叉树的某结点若无左孩子结点 则它必是叶结点 为什么 先序遍历和中序遍历相同的二叉树 先序遍历和后序遍历相同的二叉树 中序遍历和后序遍历相同的二叉树 例3 9 试举出 例3 11 设高为h的二叉树只有度为0和度为2的结点 则此类二叉树的结点树至少为 至多为 2h 1 2h 1 例3 12 一棵有124个叶子结点 n0 的完全二叉树 最多有 个结点 n 例3 13 证明任一棵满二叉树T中的分支数B满足 B 2 n0 1 其中n0为叶子结点数 证明 满二叉树中不存在度为1的节点 设度为2的结点数为n2则 n n0 n2又 n B 1所以有 B n0 n2 1 而n0 n2 1 n2 n0 1B n0 n0 1 1 2 n0 1 例3 14 具有n个结点的满二叉树 其叶子结点的个数为多少 例3 15 n个结点的完全二叉树 其叶子结点的个数为多少 方法一 设满二叉树的高度为 则根据二叉树的性质 叶子结点数为2h 1 二叉树总结点数n 2h 1 可导出 h 1 n 1 2 方法二 结点总数 n n0 n1 n2 但对满二叉树 除有n0 n2 1外 还有n1 0 故有 n n0 n0 1n0 n 1 2 BTREE Setup3 BTREE bt intn 交互问答方式创建二叉树 charch if n 0 printf 根结点 fflush stdin scanf ch 例3 16 二叉树建立方法之二 例3 17 求任意二叉树的宽度 intWidth BTREE T 求二叉树的宽度inti n 0 front 0 rear 0 max 0 lev 1 maxlev 10 0 structW BTREE Node intNodelev Q 50 Q front Node T Q front Nodelev 1 while frontlchild Q rear Node Q front Node lchild Q rear Nodelev Q front Nodelev 1 if Q front Node rchild Q rear Node Q front Node rchild Q rear Nodelev Q front Nodelev 1 front for i 0 i rear i maxlev Q i Nodelev for i 0 i 10 i if max maxlev i max maxlev i return max intDepth BTREE bt 求二叉树的深度 intldepth rdepth if bt Null return 0 else ldepth Depth bt lchild rdepth Depth bt rchild if ldepth rdepth return ldepth 1 elsereturn rdepth 1 例3 18 求任意二叉树的深度 讨论 如果让你设计一棵三叉树 你会怎么做 typedefstructBiTPNode ElementTypedata structBiTPNode parent lchild rchild BiPTree 二叉树的三叉链表存储表示 BiTPNode n个结点的二叉树有n 2个空指针 很显然 相对二叉链表表示的二叉树 除了找父结点的操作变得很容易外 其它基本操作没有什么变化 问题 对二叉树的先序 中序 后序的非递归遍历 不需要再使用栈 voidInOrder TriTreePT void visit TElemType TriTreep PT pr while p if p lchild p p lchild 找最左结点else visit p data 访问最左节点if p rchild p p rchild 若有右子树 找右子树最左结点else pr p 否则返回其父亲p p parent while p 若其不是从左子树回溯来的 或左结点的父亲并没有右孩子 该while循环沿双亲链一直查找 若无右孩子则访问 直至找到第一个有右孩子的结点为止 但不访问该结点 留给下步if语句访问 访问父亲 并转到右孩子 经上步while处理 可以确定此时p有右孩子 不用栈非递归遍历 思考题 1 如何判断一颗任意二叉树是否为满二叉树 2 如何判断一颗任意二叉树是否为完全二叉树 3 求二叉树任意结点所在的层 4 求任意结点的所有祖先结点 根到该结点的路径 5 统计任意二叉树中的结点个数 总结点 度为2 度为1 度为0的结点个数 6 将二叉链表存储的二叉树转换到按照完全二叉树存储的数组中 表示空结点 3 2 4线索二叉树 问题的提出 1 在n个结点的二叉树左右链表示中 有n 1个空链域 如何利用n 1个空链域 使二叉树的操作更加方便 2 在二叉树左右链表示中 为求某个结点的 中序 前驱 P或 中序 后继p 每次都要从树根开始进行查找 很不方便 定义 若结点p有左孩子 则p lchild指向其左孩子结点 否则令其指向其 中序 前驱 若结点p有右孩子 则p rchild指向其右孩子结点 否则令其指向其 中序 后继 结点类型LNode StructLNode ElementTypedata StructLNode lchild rchild intltag rtag 讨论 为方便操作利用了n 1个指针 但为实现操作却多用了2n个标志位 如何理解 TypdefStructLNode THTREE 中序线索化 1 将二叉树的空指针改为指向前驱或后继的线索 2 前驱或后继的信息只有在遍历时才能得到 3 线索化 在遍历的过程中修改线索 pre始终指向刚刚访问过的节点 p指向当前访问过的节点 pre指向他的前驱 StatusInOrderThreading THTREE 右子树线索化 中序线索化算法 THTREEInNext THTREEp THTREEQ Q p rchild if p rtag 1 while Q ltag 1 Q Q lchild return Q 例3 19 求p 中序后继 分析 1 当p rtag 0时 p rchild既为所求 线索 2 当p rtag 1时 p 为p的右子树的最左结点 THTREEInPre THTREEp THTREEQ Q p lchild if p ltag 1 while Q rtag 1 Q Q rchild return Q 例3 20 求 p 中序前驱 分析 1 当p ltag 0时 p lchild既为所求 线索 2 当p ltag 1时 p为p的左子树的最右结点 例3 21 利用InNext算法 中序遍历线索二叉树 VoidTHInOrder THTREEHEAD THTREEtemp temp HEAD do temp InNext temp if temp HEAD visit temp data while temp HEAD voidInOrderTraverse Thr THTREET p T lchild while p T while p ltag 1 p p lchild visit p data while p rtag 0 非递归 不利用栈 中序遍历 中序 线索二叉树 而在线索树中结点的插入与删除操作则不同 因为要同时考虑修正线索的操作 在二叉树中一般不讨论结点的插入与删除操作 原因是其插入与删除的操作与线性表相同 所不同的是需要详细说明操作的具体要求 例 将结点R插入作为结点S的右孩子结点 1 若S的右子树为空 插入比较简单 2 若S的右子树非空 则R插入后原来S的右子树作为R的右子树 操作 VoidRINSERT THTREES THTREER THTREEW R rchild S rchild R rtag S rtag R lchild S R ltag 0 S rchild R S rtag 1 if R rtag 1 w InNext R w lchild R 3 2 5二叉树的复制 1 二叉树的相似与等价 两棵二叉树具有相同结构指 1 它们都是空的 2 它们都是非空的 且左右子树分别具有相同结构 定义 具有相同结构的二叉树为相似二叉树 定义 相似且相应结点包含相同信息的二叉树称为等价二叉树 形状 相同 判断两棵二叉树是否等价算法 intEqual firstbt secondbt BTREEfirstbt secondbt intx x 0 if IsEmpty firstbt Equal 2 二叉树的复制 BTREECopy BTREEoldtree BTREEtemp if oldtree Null temp NewNode temp lchild Copy oldtree lchild temp rchild Copy oldtree rchild temp data oldtree data return temp return Null Copy 3 3堆 Heap 如果一棵完全二叉树的任意一个非终端结点的元素都不小于其左儿子结点和右儿子结点 如果有的话 的元素 则称此完全二叉树为最大堆 同样 如果一棵完全二叉树的任意一个非终端结点的元素都不大于其左儿子结点和右儿子结点 如果有的话 的元素 则称此完全二叉树为最小堆 堆的特点 最大堆的根结点中的元素在整个堆中是最大的 最小堆的根结点中的元素在整个堆中是最小的 最大堆 操作 1 MaxHeap heap 创建一个空堆2 HeapFull heap 判断堆是否为满3 Insert heap item 插入一个元素4 HeapEmpty heap 判断堆是否为空5 DeleteMax heap 删除最大元素 defineMaxsize200 最大堆 类型定义Typedefstruct intkey otherfields ElementType Typedefstruct ElementTypeelements MaxSize intn 当前元素个数计数器 HEAP VoidMaxHeap Heapheap heap n 0 BoolHeapEmpty HEAPheap return heap n BoolHeapFull HEAPheap return heap n MaxSize 1 堆ADT操作 45 30 18 15 27 9 4 3 12 8 Insert HEAPheap ElementTypeelement VoidInsert HEAPheap ElementTypeelement inti if HeapFull heap i heap n 1 while i 1 树的高度为 log n 1 Tn O logn DeleteMax HEAPheap VoidDeleteMax HEAPheap 删除堆中的最大元素 根 intparent 1 child 2 ElementTypeelement tmp if HeapEmpty heap element heap elements 1 tmp heap elements heap n while child heap elements child break heap elements parent heap elements child parent child child 2 heap elements parent tmp returnelement 树的高度为 log n 1 Tn O logn 3 4选择树 SelectionTree 顺串12345678 一棵选择树是一棵二叉树 其中每一个结点都代表该结点两个儿子中的较小者 这样 树的根结点就表示树中最小元素的结点 顺串4中的6为胜利者 竞赛在兄弟结点之间进行结果放在父结点中 3 5树 3 5 1抽象数据型树 Parent n T 求结点n的双亲 LeftMost Child n T 返回结点n的最左儿子 Right Sibling n T 返回结点n的右兄弟 Data n T 返回结点n的信息 Createk v T1 T2 Tk k 1 2 建立data域v的根结点r 有k棵子树T1 T2 Tk且自左至右排列 返回r Root T 返回树T的根结点 树的三种遍历 先 根 序 访问根结点 先根顺序遍历T1 先根顺序遍历T2 先根顺序遍历Tk 中 根 序中根顺序遍历T1 访问根结点 中根顺序遍历T2 中根顺序遍历Tk 后 根 序后根顺序遍历T1 后根顺序遍历T2 后根顺序遍历Tk 访问根结点 例3 22 假设树的类型为TREE 结点的类型为Node 数据项的类型为elementtype 用递归方法给出树的先根遍历如下 VoidPreOrder n T Noden TREET Nodec visit Data T c LeftMost Child n T while c Null PreOrder c T c Right Sibling c T 3 5 2树的存储结构 1 树的双亲表示法 数组实现方法 树的结点依次编号为1 2 3 n 设数组A i 一般有 Parent i A i StructNode intparent chardata TypdefNodeTREE 11 TREET 面向特定的操作 设计合适的存储结构 树的双亲表示法的改进方案 TypedefintNode TypedefNodeTREE MaxNodes NodeLeftMost Child n T Noden TREET Nodei for i n 1 i MaxNodes 1 i if T i n return i i为最左孩子return 0 n是叶子 算法LeftMost Child T 7 parent 3 T 7 data G 2 树的孩子表示法 邻接表表示法 typedefstructCTNode intchild structCTNode next ChildPtr typedefstruct Telementtypedata ChildPtrfirstchild CTBox typedefstruct CTBoxNodes MAX TREE SIZE intn r Ctree 3 树的孩子兄弟表示法 二叉树表示法 类型 typedefstructCSNode ElemTypedata structCSNode firstchild nextsibling Struct DataTypedata intLeftChild intRightSibling CellSpace MaxNodes 3 6森林与二叉树 森林转换为二叉树 1 先将森林中每棵树转换成二叉树 2 二叉树的树根连接起来 集合 性质相同的元素所组成的整体 假定集合的元素为1 2 3 n 而由这些元素组成的集合两两不相交 例如 S1 1 7 8 9 S2 2 5 10 S3 3 4 6 n 10 3 7 1集合的树结构表示 1 8 7 9 5 2 10 3 4 6 S1 S3 S2 3 7树的应用 MFSET集合上的基本操作 Union Si Sj S ifSi Sj S Si Sj 如 S1 S2 1 2 5 7 8 9 10 Find i S 求包含元素i的集合S Initial x S 建立集合S 使之只包含x 集合的树结构表示 父链表示 1 令集合的元素 正整数 对应于数组的下标 2 而相应的元素值表示其父结点所对应的数组元素下标 definen元素的个数typedefintMFSET n 1 集合的 型 为MFSET 元素的 型 为int MFSETS 1 8 7 9 5 2 10 3 4 6 S1 S3 S2 集合的Union 并 操作 把其中之一当成另一棵树的子树即可 1 8 7 9 5 2 10 5 2 10 S1 S2 1 8 7 9 集合的Find 包含 操作 用根结点元素代表这棵树对应的集合Find i S 即为求元素i所在的树根 voidUnion inti intj MFSETS S i j 归并 结果树之根为j voidInitial intx MFSETS S x 0 intFind inti MFSETS inttmp i while S tmp 0 0 未到根 tmp S tmp 上溯 returntmp 或 算法分析 考虑n个元素1 2 3 n 开始时令每个元素自成一个集合 即 Si i 1 i n 当采用树结构表示这些集合时 即可得到由n棵书组成的森林 每一棵树仅有一个结点i组成 S i 0 执行下列操作 Union 1 2 S Find 1 S Union 2 3 S Find 1 S Union n 1 n S Find 1 S 结果得到一个退化的单链树 时间复杂性 执行Union操作的时间是O 1 共n 1次 所需时间为O n 每次执行Find 1 S 都要从结点1开始向上找到根 在第i层时 Find 1 S 所需要的时间为O i 共n 2次 所需要时间为 O i O n2 i 1 2 3 n 2 原因 在 并 操作时 将结点多的并入结点少的 从而形成单链树 存储结构 typedefstruct intfather intcount 计数加权 MFSET n 1 改进的MFSET的实现 改进Union 并 操作的原则 将结点少的并入结点多的 相应的存储结构也要提供支持 以计数加权规则压缩高度 voidUnion intA intB MFSETC if C A count C B count B A C B father A 并入A C A count C B count else A B C A father B 并入B C B count C A count O 1 intFind intx MFSETC inttmp x while C tmp father 0 0 未到根 tmp C tmp father 上溯 returntmp O n O logn voidInitial intA MFSETC C A father 0 C A count 1 O 1 等价关系 集合S上具有自反性 对称性和传递性的二元关系R 等价类 x S y S x y也记为 x y R或xRy 集合S上一个等价关系唯一确定一个等价类的集合S R 商集 等价分类 把一个集合分成若干个等价类的过程 分清 分净 等价分类算法 例如集合S 1 2 3 4 5 6 7 的等价对分别是 1 2 5 6 3 4 1 4过程 令集合中的每一个元素自身构成一个等价类 1 2 3 4 5 6 7 自左而右处理每一个等价对 得到等价类如下 1 2 1 2 3 4 5 6 7 5 6 1 2 3 4 5 6 7 3 4 1 2 3 4 5 6 7 1 4 1 2 3 4 5 6 7 集合的等价分类 voidEquivalence MFSETS 等价分类算法 inti j k m for i 1 i i j 读入等价对 while i 0 1 令S中的每一个元素自身构成一个等价类 S1 S2 S7 2 重复读入等价对 i j 对每个读入的等价对 i j 求出i和j所在的集合Sk和Sm 不失一般性 若Sk Sm 则将Sk并入Sm 并将Sk置空 当所有的等价对处理过后 S1 S2 S7中的非空集合即为S的R等价类 等价分类算法 如内结点数为n 则外结点S n 1 内结点路径长度I 2 1 3 2 1 3 11 外结点路径长度E 1 2 5 3 2 4 25 如内结点路径长度为I 则外结点路径长度E I 2 n 设 wi 2 3 4 11 求 wj lj 加权路长 a 11 1 4 2 2 3 3 3 34 b 2 1 3 2 4 3 11 3 53 c 2 2 11 2 3 2 4 2 40 3 7 2哈夫曼树及其应用 wi 2 3 4 11 构造哈夫曼树 3 重复步骤 2 4 直到最后形成一棵增长树 为哈夫曼树 给定实数w w1 w2 wm 构造以wi为权的增长树 其中 wi li最小的一棵二叉树称为哈夫曼树 Wi 2 3 5 7 11 13 17 19 23 29 31 37 41 哈夫曼树构造过程 wili 804 typedefstruct floatweight intlchild rchild parent HTNODE typedefHTNODEHuffmanT m n 5 m 9 n m voidSelectMin HuffmanTT intn1 int p1 int p2 inti j for i 0 iT i weight voidCreatHT HuffmanTT 创建哈夫曼树 inti p1 p2 InitHT T for i n i m i SelectMin T i 1 哈夫曼树创建方法1 typedefstructHNODE intdata lev structHNODE next lchild rchild HTREE Head Head Head 0 1 2 哈夫曼树创建方法2 Head Head Head 3 4 5 voidHuffman HTREE H 创建哈夫曼树 HTREE p q r while H next next Null p H next q H next next H next q next r HTREE malloc sizeof structHNODE if r printf 内存错误 n exit 0 r data p data q data r lev p lev q lev p lev 1 q lev 1 p lev q lev r lev 1 r lchild p r rchild q Insert H r voidInsert HTREE 例 输入一批学生成绩 将百分制转换成五级分制 并且已知 If a 60 b fail Elseif a 70 b pass elseif a 80 b general elseif a 90 b good elseb excellent 如图 a 所示 以5 15 40 30 10为权构造哈夫曼树如图 b 所示 将判定框中的条件分开 可得到 c 哈夫曼树应用 最优编码 Huffman编码 问题的提出 哈2594尔2291滨1785工2504业5024大2083学4907 哈夫曼树可用来选择字符的最佳编码 实现字符编码平均长度最短的字符编码 例如 消息由 a b c d e 5个字符组成 已知各字符出现的概率分别为 0 12 0 40 0 15 0 08 0 25 现用一个二进制数字串对每个字符进行编码 使任意一个字符的编码不会是任何其他字符编码的前缀 满足 前缀性 例如 二进制串001010011按code1编码 bcd二进制串1101001按code2编码 bcd 将前缀编码看成是二叉树中的路径 每个结点的左分支附以0 右分支附以1 将字符作为叶结点的标号 从根结点到叶结点的路径上的0或1构成的序列就是相应字符的编码 abcde 0 1 0 1 0 1 0 1 0 0 code1的二叉树 ad 0 1 0 1 0 1 1 0 ceb code2的二叉树 问题 对于给定的字符集以及这些字符出现的频率 如何求一种有前缀性的编码 使字符编码的平均长度最小 code1的平均长度 3 0 12 0 40 0 15 0 08 0 25 3 0code2的平均长度 3 0 12 0 08 2 0 40 0 15 0 25 2 2 很显然 code2编码的平均长度要比code1编码的平均长度小 但 有没有比code2编码的平均长度还小的编码呢 以 a b c d e 5个字符出现的频率为权 构造哈夫曼树 即 wi 0 12 0 40 0 15 0 08 0 25 Code3编码的平均长度 即 wili 2 15bcd的编码为 01101110 前缀码与非前缀码 例 CASTCATSSATATATASA D A C S T 按出现的频率w 7 2 4 5 编码A 0T 10S 110C 111 CASTCATSSATATATASA 11101101011101011011001001001001100 哈夫曼编码 最优编码 例3 23 某文件内一组原始数据 原始数据的代码转换 国
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年县级农业技术员招聘考试全真模拟题及详解
- 2025年船舶驾驶员英语模拟题库
- 公务员面试题及答案排序
- 2025年政府部门招聘公务员笔试模拟题及答案解析
- 2025年软件开发过程中的质量控制与测试技巧实战教程
- 2025年初级会计职称考试应试技巧与解析
- 2025年航空机械专业基础知识面试模拟题集与解析
- 2025年碳汇项目开发师蓝碳方向考试必-备知识点
- 2025年银行系统技术部招聘笔试精讲与答案
- 2025年裂解过程优化模拟测试
- 公安行政案件办理务实课件
- 房地产样板间装饰工程重点难点及措施
- 康复科护理金点子
- 工地油库安全管理办法
- 全球治理转型-洞察及研究
- 高等数学课程教学中遇到的问题及解决对策
- (高清版)DB32∕T 4001-2025 公共机构能耗定额及计算方法
- 电力物资打包方案(3篇)
- 2025至2030中国味精行业发展趋势分析与未来投资战略咨询研究报告
- 你的样子就是教育的样子-一位校长对教师行为规范的深度思考建议收藏
- 中医治疗泌尿系结石课件
评论
0/150
提交评论