数据结构(第六章 树与二叉树).pptVIP

  • 3
  • 0
  • 约3.49万字
  • 约 158页
  • 2019-11-01 发布于湖北
  • 举报
6.4 树和森林 树和森林的遍历 int TreeDepth(CSTree T) { if(!T) return 0; else { h1 = TreeDepth( T-firstchild ); h2 = TreeDepth( T-nextsibling); } } // TreeDepth return(max(h1+1, h2)); 一、求树的深度的算法: 此算法是一个通用算法(广义的森林的深度算法),当树和森林都以二叉链表表示时,此算法既可以求树的深度,也可以求森林的深度。 树: 存在左子树,右子树为空 ,则树的深度为h1+1 , h2=0 森林:h1为第一棵子树森林的深度,h2为其余子树森林的深度。 6.4 树和森林 树和森林的遍历 二、输出树中所有从根到叶子的路径的算法: 例如:对左图所示的树,其输出结果应为: A B E A B F A C A D G H I A D G H J A D G H K A B C D E F G H I J K 6.4 树和森林 树和森林的遍历 void AllPath( Bitree T, Stack S ) {// 输出二叉树上从根到所有叶子结点的路径 if (T) { Push( S, T-data ); if (!T-Lchild !T-Rchild ) PrintStack(S); //输出路径 else { AllPath( T-Lchild, S ); AllPath( T-Rchild, S ); } Pop(S);//以该结点为根的路径求完,退出。 } // if(T) } // AllPath 二、输出树中所有从根到叶子的路径的算法: E B A 6.4 赫夫曼树及其应用 最优树的定义 如何构造最优树 前缀编码 6.5 赫夫曼树及其应用 相关术语 路径:从树中一个结点到另一个结点之间的分支 构成这两个结点间的路径。 路径长度:路径上的分支数 树的路径长度:从树根到每一个结点的路径长度之和 树的带权路径长度:树中所有带权结点的路径(Weighted Path Length ) 长度之和。 r d c a b 2 4 7 5 例如: 第k个叶子结点到根的路径长度 — 个叶子结点的权值 第 — 叶子结点的个数 其中: 记作: k WPL 1 k k n k l w n lk wk - = ? = 例 有4个结点a,b,c,d,其权值分别为7,5,2,4,构造有4个叶子结点的二叉树 a b c d 7 5 2 4 WPL =7*2+5*2+2*2+4*2 =36 d c a b 2 4 7 5 WPL=7*3+5*3+2*1+4*2=46 a b c d 7 5 2 4 WPL=7*1+5*2+2*3+4*3=35 6.5 赫夫曼树及其应用 相关术语 6.5 赫夫曼树及其应用 最优树的定义 赫夫曼树(Huffman树)—— 又称最优二叉树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。 教材定义:设有n个权值{w1,w2,……wn},构造一棵有n个叶子结点的二叉树,每个叶子的权值为wi,则WPL最小的二叉树叫赫夫曼树或最优二叉树。 6.5 赫夫曼树及其应用 如何构造最优树 构造赫夫曼树 Huffman给出构造最优二叉树的算法,具体构造赫夫曼算法的步骤如下: ⑴ 根据给定的 n 个权值{w1, w2, …, wn}构成 n 棵二叉树的集合 F ={T1, T2, …, Tn} ,其中每棵二叉树 Ti (1≤i≤n) 中只有一个带权为wi的根结点,其左右子树均空; ⑵ 在 F 中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。  ⑶ 在F中删除这两棵树,同时将新得到的二叉树加入 F 中。  重复(2)和(3),直到 F 只含一棵树为止。这棵树便是所求的赫夫曼树。 例如,对5个权值 {5,6,2,9,7} 构造最优二叉树的过程如动画所示 6.5 赫夫曼树及其应用 如何构造最优树 6.5 赫夫曼树及其应用 如何构造最优树 9 例如: 已知权值 W={ 5, 6, 2, 9, 7 } 5 6 2 7 5 2 7 6 9 7 6 7 13 9 5

文档评论(0)

1亿VIP精品文档

相关文档