数据结构 南京信息工程大学计算机与软件学院 刘景发

上传人:第*** 文档编号:50055854 上传时间:2018-08-06 格式:PPT 页数:145 大小:2.15MB
返回 下载 相关 举报
数据结构  南京信息工程大学计算机与软件学院   刘景发_第1页
第1页 / 共145页
数据结构  南京信息工程大学计算机与软件学院   刘景发_第2页
第2页 / 共145页
数据结构  南京信息工程大学计算机与软件学院   刘景发_第3页
第3页 / 共145页
数据结构  南京信息工程大学计算机与软件学院   刘景发_第4页
第4页 / 共145页
数据结构  南京信息工程大学计算机与软件学院   刘景发_第5页
第5页 / 共145页
点击查看更多>>
资源描述

《数据结构 南京信息工程大学计算机与软件学院 刘景发》由会员分享,可在线阅读,更多相关《数据结构 南京信息工程大学计算机与软件学院 刘景发(145页珍藏版)》请在金锄头文库上搜索。

1、第六章 树和二叉树16.1 树的类型定义6.2 二叉树的类型定义 6.3 二叉树的存储结构 6.4 二叉树的遍历 6.5 线索二叉树6.6 树和森林的表示方法 6.7 树和森林的遍历 6.8 哈夫曼树与哈夫曼编码 26.1 树的类型定义3数据对象 D: D是具有相同特性的数据元素的集合。若D为空集,则称为空树 。否则:(1) 在D中存在唯一的称为根的数据元素root;(2) 当n1时,其余结点可分为m (m0)个互不相交的有限集T1, T2, , Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。数据关系 R:4基本操作:查 找 类插 入 类删 除 类5Root(T) /

2、求树的根结点 查找类:Value(T, cur_e) / 求当前结点的元素值 Parent(T, cur_e) / 求当前结点的双亲结点LeftChild(T, cur_e) / 求当前结点的最左孩子 RightSibling(T, cur_e) / 求当前结点的右兄弟TreeEmpty(T) / 判定树是否为空树 TreeDepth(T) / 求树的深度TraverseTree( T, Visit() ) / 遍历6InitTree( Value(T, e); Parent(T, e);LeftChild(T, e); RightChild(T, e);LeftSibling(T, e);

3、RightSibling(T, e);BiTreeEmpty(T); BiTreeDepth(T);PreOrderTraverse(T, Visit();InOrderTraverse(T, Visit();PostOrderTraverse(T, Visit();LevelOrderTraverse(T, Visit();21InitBiTree(Assign(T, CreateBiTree(InsertChild(T, p, LR, c);22ClearBiTree( DestroyBiTree(DeleteChild(T, p, LR);23二叉树的重要特性24 性质 1 :在二叉树的

4、第 i 层上至多有2i-1 个结点。(i1)用归纳法证明:归纳基:归纳假设:归纳证明:i = 1 层时,只有一个根结点:2i-1 = 20 = 1;假设对所有的 j,1 j i,命题成立;二叉树上每个结点至多有两棵子树, 则第 i 层的结点数 = 2i-2 2 = 2i-1 。25性质 2 :深度为 k 的二叉树上至多含 2k-1 个结点(k1)。证明:基于上一条性质,深度为 k 的二叉树上的结点数至多为20+21+ +2k-1 = 2k-1 。26 性质 3 :对任何一棵二叉树,若它含有n0 个叶 子结点、n2 个度为 2 的结点,则必存在 关系式:n0 = n2+1。证明:设n1为二叉树T

5、中度为1的结点数,则二叉树上结点总 数 n = n0 + n1 + n2 又 二叉树上分支总数 b = n1+2n2而 b = n-1 = n0 + n1 + n2 - 1 由此, n0 = n2 + 1 。27两类特殊的二叉树:满二叉树:指的是 深度为k且含有2k-1个结点的二叉树。完全二叉树:树 中所含的 n 个结点 和满二叉树中编号 为 1 至 n 的结点一 一对应。123456789 10 11 12 13 14 15abcdefghij 28性质 4 :具有 n 个结点的完全二叉树的深度 为 log2n +1 。证明:设完全二叉树的深度为 k 则根据第二条性质得 2k-1n n,则该

6、结点无左孩子,否则,编号为 2i 的结点为其左孩子结点; (3) 若 2i+1n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。30 用typedef定义类型l功能:用自定义名字为已有数据类型命名l类型定义简单形式: typedef type name; 例 typedef int INTEGER;类型定义语句关键字已有数据类型名用户定义的类型名例 typedef float REAL;类型定义后,与已有类型一样使用例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 说明: 1.typedef 没有创造新数据类型 2.t

7、ypedef 是定义类型,不能定义变量 3.typedef 与 define 不同define typedef 预编译时处理 编译时处理 简单字符置换 为已有类型命名 31ltypedef定义类型步骤 按定义变量方法先写出定义体 如 int i; 将变量名换成新类型名 如 int INTEGER; 最前面加typedef 如 typedef int INTEGER; 用新类型名定义变量 如 INTEGER i,j; 例 定义数组类型 int a100; int ARRAY100; typedef int ARRAY100; ARRAY a,b,c; int a100,b100,c100;例 定

8、义指针类型 char *str; char *STRING; typedef char *STRING; STRING p,s10; char *p; char *s10;32l DATE birthday, *p; typedef struct date int month;int day;int year;DATE; struct date int month;int day;int year;DATE;例 定义结构体类型 struct date int month;int day;int year;d; struct date int month;int day;int year;bir

9、thday, *p;33typedef struct ElemType *elem; / 存储空间基址int length; / 当前长度int listsize; / 当前分配的存储容量 SqList; / 顺序表Typedef struct LNode ElemType data; / 数据域struct Lnode *next; / 指针域 LNode, *LinkList; /单链表346.3 二叉树的存储结构二、二叉树的链式存储表示一、 二叉树的顺序存储表示35#define MAX_TREE_SIZE 100 / 二叉树的最大结点数 typedef TElemType SqBiTr

10、eeMAX_TREE_SIZE; / 0号单元存储根结点 SqBiTree bt;一、 二叉树的顺序存储表示36例如:ABCDEFA B D C E F0 1 2 3 4 5 6 7 8 9 10 11 12 13140132637二、二叉树的链式存储表示1. 二叉链表2三叉链表3双亲链表4线索链表38ADEBCFrootlchild data rchild结点结构:1. 二叉链表39typedef struct BiTNode / 结点结构TElemType data;struct BiTNode *lchild, *rchild; / 左右孩子指针 BiTNode, *BiTree;lch

11、ild data rchild结点结构:C 语言的类型描述如下:40ADEBCFroot2三叉链表parent lchild data rchild结点结构:41typedef struct TriTNode / 结点结构TElemType data;struct TriTNode *lchild, *rchild; / 左右孩子指针struct TriTNode *parent; /双亲指针 TriTNode, *TriTree;parent lchild data rchild结点结构:C 语言的类型描述如下:42结点结构:3双亲链表data parentABDCEF0B4 1D4 2C0

12、 3E1 4A-1 5F3 6LRTagL R R RL根n = 643typedef struct BPTNode / 结点结构TElemType data;int *parent; / 指向双亲的指针char LRTag; / 左、右孩子标志域 BPTNodetypedef struct BPTree / 树结构BPTNode nodesMAX_TREE_SIZE;int num_node; / 结点数目int root; / 根结点的位置 BPTree446.4二叉树的遍历45一、问题的提出二、先左后右的遍历算法三、算法的递归描述四、遍历算法的应用举例46顺着某一条搜索路径巡访二叉树 中

13、的结点,使得每个结点均被访问一 次,而且仅被访问一次。一、问题的提出“访问”的含义可以很广,如:输出结点的信息等。47“遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构, 每个结点有两个后继,则存在如何遍历即按什么样的搜索路径进行遍历的问题。48对“二叉树”而言,可以有三 条搜索路径: 1先上后下的按层次遍历; 2先左(子树)后右(子树) 的遍历; 3先右(子树)后左(子树) 的遍历。49二、先左后右的遍历算法先(根)序的遍历算法中(根)序的遍历算法后(根)序的遍历算法根左 子树右 子树根根根根根访问根结点、遍历

14、左子树、遍历右子树50若二叉树为空树,则空操作;否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。先(根)序的遍历算法:51若二叉树为空树,则空操作;否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。中(根)序的遍历算法:52若二叉树为空树,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。后(根)序的遍历算法:53ABCDEFGHK例如 :先序序列:中序序列:后序序列:A B C D E F G H KB D C A E H G K FD C B H K G F E A54三、算法的递归描述void Preorder (BiTree T,void( *visit)(TElemType / 访问结点Preorder(T-lchild, visit); / 遍历左子树Preorder(T-rchild, visit);/ 遍历右子树 55四、中序遍历算法的非递归描述BiTNode *GoFarLeft(BiTree T, Stack *S)if (!T ) return NULL;while (T

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号