第7章2数据结构(论文资料).pptVIP

  • 16
  • 0
  • 约2.84千字
  • 约 14页
  • 2017-01-01 发布于重庆
  • 举报
问题 针对二叉树,回答下列问题: (1)具有n个结点的非空二叉树的最小深度是多少?最大深度是多少? (2)具有n个结点的完全二叉树中有多少个叶子结点?有多少个度为2的结点? (3)具有n0个叶子结点的完全二叉树中共有多少个结点? 答:(1)其最小深度是?log2(n+1)?-1,最大深度是n。 (2)具有n个结点的完全二叉树中有?n/2?叶子结点,有?n/2?-1个度为2的结点。 (3)具有n0个叶子结点的完全二叉树中共有2n0 个结点或2n0-1个结点。 练习: 7.3 二叉树的设计和实现 7.3.1 二叉树的顺序存储结构 二叉树的存储结构主要有三种:顺序存储结构、链式存储结构和仿真指针存储结构。 1. 二叉树的顺序存储结构 完全二叉树的结点可按从上至下和从左至右的次序存储在一维数组中,其结点之间的关系可由公式计算得到,这就是二叉树的顺序存储结构。图7-4在数组中的存储结构为: 数组 下标 0 1 2 3 4 5 6 3. 二叉树的仿真指针 7.3.2 二叉链存储结构的二叉树操作实现 在二叉链存储结构下,针对一棵二叉树,主要涉及如下几个功能模块: 二叉树的初始化操作; 二叉树中给某结点插入一个左结点的操作; 二叉树中给某结点插入一个右结点的操作; 删除二叉树中某结点的左子树操作; 删除二叉树中某结点的右子树操作。 各算法的基本思想及程序实现如下: typedef struct Node { DataType data; struct Node *leftChild; struct Node *rightChild; }BiTreeNode; /*结点的结构体定义*/ 2.二叉树中给某结点插入一个左结点的操作 算法的基本思想: 若当前结点(假设为curr)非空,在curr的左子树插入元素值为x的新结点 ,原curr所指结点的左子树成为新插入结点的左子树。若插入成功返回新插入结点的指针,否则返回空指针。 4.删除二叉树中某结点的左子树操作 例:编写一个建立图7-10(b)所示的带头结点的二叉链存储结构二叉树的程序。 设计:假设上述二叉树结点结构体定义和二叉树操作实现函数存放在文件“Bitree.h”中,程序设计如下: #include stdlib.h #include stdio.h typedef char DataType; #include Bitree.h * * 一棵完全二叉树有1000个结点,则它必有 个叶子结点,有 个度为2的结点,有 个结点只有非空左子树,有 个结点只有非空右子树。 正确答案: 全部叶子数=?1000/2? =500个。 度为2的结点=叶子总数-1=499个。 因为最后一个结点坐标是偶数,所以必为左子树。有 1 个结点只有非空左子树,有 0 个结点只有非空右子树。 g f e d c b a 问题:对于一般的二叉树如何存储呢? 显然不能直接使用二叉树的顺序存储结构。我们可以采取下面这种办法:首先在非完全二叉树中增添一些并不存在的空结点使之变成完全二叉树的形态,然后再用顺序存储结构存储。 数组 下标 0 1 2 3 4 5 6 7 8 9 10 11 12 (c) (a)一般二叉树 (b)完全二叉树 (c)在数组中的存储形式 图7.6 一般二叉树的顺序存储结构 G Λ Λ F Λ Λ Λ E D Λ C B A 2. 二叉树的链式存储结构 二叉树的链式存储结构是用指针建立二叉树中结点之间的关系。二叉树最常用的的链式存储结构是二叉链。二叉链存储结构的每个结点包含三个域,分别是数据域data、左孩子指针域leftChild和右孩子指针域rightChild。二叉链存储结构中每个结点的图示结构为: rightChild data leftChild 二叉链存储结构的二叉树也有不带头结点和带头结点两种。带头结点的二叉链存储结构的二叉树见图7.10(b),不带头结点的二叉链存储结构的二叉树如图7.10(a)所示。 图7.10 二叉链存储结构的

文档评论(0)

1亿VIP精品文档

相关文档