收藏 分享(赏)

第7章 解决二叉树的编程问题.ppt

上传人:sjmd695 文档编号:10201070 上传时间:2019-10-18 格式:PPT 页数:25 大小:1.49MB
下载 相关 举报
第7章 解决二叉树的编程问题.ppt_第1页
第1页 / 共25页
第7章 解决二叉树的编程问题.ppt_第2页
第2页 / 共25页
第7章 解决二叉树的编程问题.ppt_第3页
第3页 / 共25页
第7章 解决二叉树的编程问题.ppt_第4页
第4页 / 共25页
第7章 解决二叉树的编程问题.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、解决二叉树的编程问题,数据结构(C#语言版),目标,在本章中,你将达到以下目标: 理解二叉树的两种存储结构 解决二叉树的编程问题 构造哈夫曼编码,学习情境用二叉树解决快速搜索磁盘文件中的编程,问题描述 磁盘上有一个文件,物理上随机存储了很多记录,如下表(a),每条记录有一个关键字(职工号)段唯一的标识该记录。为了方便对表(a)的记录进行增、删、改、查,一般需要建立索引表(b)。,现需要实现如下的功能: 选择一种数据结构在内存中存放索引表,通过该数据结构能高效地插入、删除和搜索索引表; 输入任一关键字,显示出查询该关键字的路径。,认识二叉树分析二叉树的逻辑结构,1、二叉树的定义二叉树(Binar

2、y Tree)是n(n0)个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。,左子树,右子树,左子树,右子树,、二叉树的种形态,认识二叉树分析二叉树的逻辑结构,、二叉树的相关术语 (1)结点的度。结点所拥有的子树的个数称为该结点的度。 (2)叶结点。度为0的结点称为叶结点,或者称为终端结点。 (3)分枝结点。度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点除叶结点外,其余的都是分支结点。 (4)左孩子、右孩子、双亲。树中一个结点的子树的根结

3、点称为这个结点的孩子。这个结点称为它孩子结点的双亲。具有同一个双亲的孩子结点互称为兄弟。 (5)路径、路径长度。如果一棵树的一串结点n1,n2,nk有如下关系:结点ni是ni+1的父结点(1ik),就把n1,n2,nk称为一条由n1至nk的路径。这条路径的长度是k-1。 (6)祖先、子孙。在树中,如果有一条路径从结点M到结点N,那么M就称为N的祖先,而N称为M的子孙。,认识二叉树分析二叉树的逻辑结构,、二叉树的相关术语(7)结点的层数。规定树的根结点的层数为1,其余结点的层数等于它的双亲结点的层数加1。 (8)树的深度。树中所有结点的最大层数称为树的深度。 (9)树的度。树中各结点度的最大值称

4、为该树的度。 (10)满二叉树。 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。,认识二叉树分析二叉树的逻辑结构,、二叉树的相关术语(11)完全二叉树。一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1in)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。完全二叉树的特点是:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。,认识二叉树识别二叉树的基本操作,Initiate(bt):建立一棵空二叉树。 Create(x,lbt,

5、rbt):生成一棵以x为根结点的数据域信息,以二叉树lbt和rbt为左子树和右子树的二叉树。 InsertL(bt,x,parent):将数据域信息为x的结点插入到二叉树bt中作为结点parent的左孩子结点。如果结点parent原来有左孩子结点,则将结点parent原来的左孩子结点作为结点x的左孩子结点。 InsertR(bt,x,parent):将数据域信息为x的结点插入到二叉树bt中作为结点parent的右孩子结点。如果结点parent原来有右孩子结点,则将结点parent原来的右孩子结点作为结点x的右孩子结点。 DeleteL(bt,parent):在二叉树bt中删除结点parent的

6、左子树。 DeleteR(bt,parent):在二叉树bt中删除结点parent的右子树。 Search(bt,x):在二叉树bt中查找数据元素x。 Traverse(bt):按某种方式遍历二叉树bt的全部结点。,认识二叉树识别二叉树的主要性质,性质1 一棵非空二叉树的第i层上最多有2i-1个结点(i1)。 性质2 一棵深度为k的二叉树中,最多具有2k1个结点。 性质3 对于一棵非空的二叉树,如果叶子结点数为n0,度数为2的结点数为n2,则有: n0n21。 性质4 具有n个结点的完全二叉树的深度k为log2n+1。 性质5 对于具有n个结点的完全二叉树,如果按照从上至下和从左到右的顺序对二

7、叉树中的所有结点从1开始顺序编号,则对于任意的序号为i的结点,有:(1)如果i1,则序号为i的结点的双亲结点的序号为i/2(“/”表示整除);如果i1,则序号为i的结点是根结点,无双亲结点。(2)如果2in,则序号为i的结点的左孩子结点的序号为2i;如果2in,则序号为i的结点无左孩子。(3)如果2i1n,则序号为i的结点的右孩子结点的序号为2i1;如果2i1n,则序号为i的结点无右孩子。此外,若对二叉树的根结点从0开始编号,则相应的i号结点的双亲结点的编号为(i1)/2,左孩子的编号为2i1,右孩子的编号为2i2。,用顺序存储结构表示二叉树,所谓二叉树的顺序存储,就是用一组连续的存储单元存放

8、二叉树中的结点。一般是按照二叉树结点从上至下、从左到右的顺序存储。 依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系。图7.6(a) 的顺序存储如图7.7:,用顺序存储结构表示二叉树,对于一般的二叉树,如果仍按从上至下和从左到右的顺序将树中的结点顺序存储在一维数组中,则数组元素下标之间的关系不能够反映二叉树中结点之间的逻辑关系,只有增添一些并不存在的空结点,使之成为一棵完全二叉树的形式,然后再用一维数组顺序存储。,用链式存储结构表示二叉树,二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链表来指示着元素的逻辑关系。 (1)二叉链

9、表存储 链表中每个结点由三个域组成,除了数据域外,还有两个指针域,分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。图7.11(a)给出了图7.6(b)所示的一棵二叉树的二叉链表示。,用链式存储结构表示二叉树,()三叉链表存储 在三叉链表存储中,每个结点由四个域组成 。parent域为指向该结点双亲结点的指针。这种存储结构既便于查找孩子结点,又便于查找双亲结点。图7.13给出了图7.6(b)所示的一棵二叉树的三叉链表示。,实现链式存储的二叉树的基本操作,public LinkBiTree(T val) public LinkBiTree(T val, Node lp, Node rp)

10、public bool IsEmpty() public Node Root() public Node GetLChild(Node p) public Node GetRChild(Node p) public void InsertL(T val, Node p) public void InsertR(T val, Node p) public Node DeleteL(Node p) public Node DeleteR(Node p) public Node Search(Node root, T value) public bool IsLeaf(Node p)具体操作参与P1

11、40-143,二叉树的遍历与实现,二叉树的遍历是指按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且仅被访问一次。 由二叉树的定义可知,一棵二叉树由根结点、根结点的左子树和根结点的右子树三部分组成。因此,只要依次遍历这三部分,就可以遍历整个二叉树。若以D、L、R分别表示访问根结点、遍历根结点的左子树、遍历根结点的右子树,则二叉树的遍历方式有六种:DLR、LDR、LRD、DRL、RDL和RLD。 如果限定先左后右,则只有前三种方式,即DLR(称为先序遍历)、LDR(称为中序遍历)和LRD(称为后序遍历)。,二叉树的遍历与实现,1先序遍历(DLR)先序遍历的递归过程为:若二叉树为空,遍历结

12、束。否则,(1) 访问根结点;(2) 先序遍历根结点的左子树;(3) 先序遍历根结点的右子树。public void preorder(Node ptr) if (IsEmpty() Console.WriteLine(“Tree is empty“);return;if (ptr != null) Console.Write(ptr.Data + “ “);preorder(ptr.LChild);preorder(ptr.RChild);,二叉树的遍历与实现,2中序遍历(LDR) 中序遍历的递归过程为:若二叉树为空,遍历结束。否则, (1)中序遍历根结点的左子树; (2)访问根结点; (3

13、)中序遍历根结点的右子树。 public void inorder(Node ptr) if (IsEmpty() Console.WriteLine(“Tree is empty“);return;if (ptr != null) inorder(ptr.LChild);Console.Write(ptr.Data + “ “);inorder(ptr.RChild);,二叉树的遍历与实现,3后序遍历(LRD) 后序遍历的递归过程为:若二叉树为空,遍历结束。否则, (1)后序遍历根结点的左子树; (2)后序遍历根结点的右子树。 (3)访问根结点;public void postorder(N

14、ode ptr) if (IsEmpty( ) Console.WriteLine(“Tree is empty“);return;if (ptr != null) postorder(ptr.LChild);postorder(ptr.RChild);Console.Write(ptr.Data + “ “);,二叉树的遍历与实现,4层次遍历所谓二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。 public void LevelOrder(Node root) if (root = null) /根结点为空return;/

15、设置一个队列保存层序遍历的结点CSeqQueue sq = new CSeqQueue(50);/根结点入队sq.EnQueue(root);while (!sq.IsEmpty() /队列非空,结点没有处理完Node tmp = sq.DeQueue(); /结点出队Console.WriteLine(“o“, tmp); /处理当前结点if (tmp.LChild != null) sq.EnQueue(tmp.LChild); /将当前结点的左孩子结点入队if (tmp.RChild != null) sq.EnQueue(tmp.RChild); /将当前结点的右孩子结点入队,用二叉搜

16、索树解决快速搜索磁盘文件中记录的问题,在二叉树中,如果一个结点的左子结点的值永远小于该结点的值,而右子结点的值永远大于该结点的值,这样的二叉树为二叉搜索树。图7.2 为基于图7.1(b)所示的索引表建立的二叉搜索树,用二叉搜索树解决快速搜磁盘文件记录代码 参见P147-150,问题描述: 统计出二叉树中叶子结点的数目 基本要求 动态构建二叉树 用递归实现该算法,活动:二叉树操作,最优二叉树哈夫曼树,最优二叉树,也称哈夫曼(Haffman)树,是指对于一组带有确定权值的叶结点,构造的具有最小带权路径长度的二叉树。 设二叉树具有n个带权值的叶结点,那么从根结点到各个叶结点的路径长度与相应叶结点权值

17、的乘积之和叫做二叉树的带权路径长度,记为:例:4个叶结点,其权值分别为1,3,5,7,可构造出形状不同的多个二叉树。带权路径长度将各不相同。图7.19给出了其中5个不同形状的二叉树。,最优二叉树哈夫曼树 构造算法,(1)由给定的n个权值W1,W2,Wn构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合FT1,T2,Tn; (2)在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和; (3)在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中; (4)重复(2)(3)两步,当F中只剩下一棵

18、二叉树时,这棵二叉树便是所要建立的哈夫曼树。,叶结点权值集合为W1,3,5,7的哈夫曼树的构造过程。,小结,在本章中,你已经学到: 二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成 二叉树中的相关概念:结点的度,叶结点,分枝结点,左孩子、右孩子、双亲,路径、路径长度,祖先、子孙,结点的层数,树的深度,树的度,满二叉树,完全二叉树。 二叉树的5个性质。 性质1 一棵非空二叉树的第i层上最多有2i-1个结点(i1)。 性质2 一棵深度为k的二叉树中,最多具有2k1个结点。 性质3 对于一棵非空

19、的二叉树,如果叶子结点数为n0,度数为2的结点数为n2,则有:n0n21。 性质4 具有n个结点的完全二叉树的深度k为log2n+1。,小结(续),性质5 对于具有n个结点的完全二叉树,如果按照从上至下和从左到右的顺序对二叉树中的所有结点从1开始顺序编号,则对于任意的序号为i的结点,有: (1)如果i1,则序号为i的结点的双亲结点的序号为i/2(“/”表示整除);如果i1,则序号为i的结点是根结点,无双亲结点。 (2)如果2in,则序号为i的结点的左孩子结点的序号为2i;如果2in,则序号为i的结点无左孩子。3)如果2i1n,则序号为i的结点的右孩子结点的序号为2i1;如果2i1n,则序号为i的结点无右孩子。 二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成 二叉树的存储主要有三种:顺序存储结构、二叉链表存储、三叉链表存储 二叉树的7种基本操作和二叉链表存储结构的类实现。二叉树的四种遍历方法:中序遍历、前序遍历、后续遍历、层次遍历。 最优二叉树,也称哈夫曼(Haffman)树,是指对于一组带有确定权值的叶结点,构造的具有最小带权路径长度的二叉树。 哈夫曼树的构造算法。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报