第6章树和二叉树-中南大学.ppt

第6章树和二叉树-中南大学.ppt

6.1 树的定义和基本术语 树是一类重要的非线性数据结构,是以分支关系定义的层次结构。 一、树的定义(递归定义) 1.树(Tree)是n(n≥0)个结点的有限集T, 如果n = 0,称为空树;否则: 有且仅有一个称为树的根(root)的结点。 其余结点可分为m(m0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)。 2、树的表示形式-—是一棵倒立的树 树的其它表示方式 二、树的基本术语 二、树的基本术语 利用结点总数与分支总数求解问题 思考题: 有n个结点的树,仅有度为0的叶子结点和 度为k的结点,问该树含有多少叶子结点? 二叉树的链式存贮结构---二叉链表 考虑: 二叉树的数据元素之间的关系 任一个结点,最多有两个孩子(直接后继元素) 二叉链表: 将一个结点分成三部分,一部分存放结点本身信息,另外两部分为指针,分别存放左、右孩子的地址。 链式存储结构--二叉链表存储示意图 分析:二叉树的递归定义: 二叉树的遍历过程(先根,中根,后根) 算法分析 3种遍历算法不同之处仅在于访问根结点、遍历左子树、遍历右子树的先后关系。若不考虑Visit()语句,则三种遍历方法完全相同(访问路径是相同的,只是访问结点的时机不同) 。 中序遍历的非递归算法思路: 设待遍历的二叉树的根结点指针为T(算法开始时,令p=T),则可能出现两种情况: 中序遍历的非递归算法描述 Status InOrderTraverse( BiTree T, status (*Visit)(TElemType e )) { InitStack( S ); p = T; while( p || !StackEmpty( S )) { if( p )// 根指针进栈,遍历左子树 { Push( S, p ); p = p-LChild;} 统计二叉树中结点的个数 void CountNode (BiTree T, int node) { //在实际使用时,node作为全局变量,其初始值为0 if ( T ) { node ++; CountNode( T-lchild, node); CountNode( T-rchild, node); } // if } // CountNode 6.3.2线索二叉树 何谓线索二叉树 线索链表的遍历算法 如何建立线索链表 (注:此部份内容了解即可,一般用的不是很多,工作面试,研究生考试一般都不涉及) 实现:定义结构数组存放树的结点,每个结点含两个域: 数据域(data):存放结点本身信息 双亲域(parent):指示本结点的双亲结点在数组中位置 多重链表: 每个结点设有多个指针域,分别指向其子树的根。 结点同构:结点的指针个数相等,为树的度D (浪费存储单元,很多结点的孩子少于D,指针域为空。) 结点不同构:结点指针个数不等,为该结点的度d (按需分配指针域,但操作不便 树与二叉树(孩子兄弟二叉树)的转换 将各棵树分别转换成二叉树 将每棵树的根结点用线相连 以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树型结构 6.5 哈夫曼树与哈夫曼编码 最优树的定义 如何构造最优树 前缀编码 哈夫曼树(Huffman树)—— 又称最优二叉树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树。 教材定义:设有n个权值{w1,w2,……wn},构造一棵有n个叶子结点的二叉树,每个叶子的权值为wi,则WPL最小的二叉树叫哈夫曼树或最优二叉树。 2)不等长编码 一般,在英文字母a—z中,e的使用频率比q,z要大得多,使用频率高的用短码,使用频率低的用长码。编码不等长,但大部分情况下电文总长度会减少 3)前缀编码(有的教材又称无前缀编码) 如何得到使电文长度最短的二进制前缀编码? 假设电文中每种字符出现的次数为Wi, 其编码长度为li ,电文中有n种字符,则电文总长为: 0 1 0 1 0 1

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档