数据结构树与二叉树

上传人:宝路 文档编号:47921146 上传时间:2018-07-06 格式:PPT 页数:137 大小:4.91MB
返回 下载 相关 举报
数据结构树与二叉树_第1页
第1页 / 共137页
数据结构树与二叉树_第2页
第2页 / 共137页
数据结构树与二叉树_第3页
第3页 / 共137页
数据结构树与二叉树_第4页
第4页 / 共137页
数据结构树与二叉树_第5页
第5页 / 共137页
点击查看更多>>
资源描述

《数据结构树与二叉树》由会员分享,可在线阅读,更多相关《数据结构树与二叉树(137页珍藏版)》请在金锄头文库上搜索。

1、 6.1 树的类型定义 6.2 二叉树的类型定义6.3 二叉树的存储结构 6.4 二叉树的遍历 6.5 线索二叉树6.6 树和森林的表示方法 6.7 树和森林的遍历 6.8 哈夫曼树与哈夫曼编码目 录6.1 树的类型定义数据对象数据对象 D D: D是具有相同特性的数据元素的集合。若D为空集, 则称为空树; 否则: (1) 在D中存在唯一的称为根的数据元素root, (2) 当n1时,其余结点可分为m (m0)个互不相交的有限集T1, T2, , Tm, 其中每一个子集本身又是一棵符合本定义的树,称为根root的子树。数据关系数据关系 R R:ADTA A B BC CD DE E F FGG

2、HHI IJ JKKL LMM*5树的示例A A B BC CD DE E F FGGHHI IJ JKKL LMMA AB BC CD DE EF FGGHHI IJ JKK L LMMA AB BC CD DE EF FGGHHI IJ JKK L LMM基本操作:基本操作:查查 找找 类类插插 入入 类类删删 除除 类类Root(T) / 求树的根结点 Value(T, cur_e) / 求当前结点的元素值 Parent(T, cur_e) / 求当前结点的双亲结点 LeftChild(T, cur_e) / 求当前结点的最左孩子 RightSibling(T, cur_e) / 求当前

3、结点的右兄弟 TreeEmpty(T) / 判定树是否为空树 TreeDepth(T) / 求树的深度 TraverseTree( T, Visit() ) / 遍历查找类操作查找类操作InitTree( Value(T, e); Parent(T, e);LeftChild(T, e); RightChild(T, e);LeftSibling(T, e); RightSibling(T, e);BiTreeEmpty(T); BiTreeDepth(T);PreOrderTraverse(T, Visit();InOrderTraverse(T, Visit();PostOrderTrav

4、erse(T, Visit();LevelOrderTraverse(T, Visit();查查 找找 类类 操操 作作InitBiTree(Assign(T, CreateBiTree(InsertChild(T, p, LR, c);插插 入入 类类 操操 作作ClearBiTree( DestroyBiTree(DeleteChild(T, p, LR);删删 除除 类类 操操 作作二叉树的重要特性性质1 :在二叉树的第 i 层上至多有2i-1 个结点 。 (i1)用归纳法证明用归纳法证明:归纳基:归纳基:归纳假设:归纳假设: 归纳证明:归纳证明:i = 1 层时,只有一个根结点, 2i

5、-1 = 20 = 1;假设对所有的 j,1 j i,命题成立;二叉树上每个结点至多有两棵子树, 则第 i 层的结点数 = 2i-2 2 = 2i-1 。性质 2 :深度为 k 的二叉树上至多含 2k-1 个 结点(k1)证明:基于上一条性质,深度为 k 的二叉树上的结点数至多为20+21+ +2k-1 = 2k-1 性质 3 :对任何一棵二叉树,若它含有n0 个叶 子结点、n2 个度为 2 的结点,则必存在 关系式:n0 = n2+1证明: 设 二叉树上结点总数 n = n0 + n1 + n2 又 二叉树上分支总数 b = n1+2n2而 b = n-1 = n0 + n1 + n2 -

6、1 由此, n0 = n2 + 1满二叉树:深度 为k且含有2k-1个 结点的二叉树。完全二叉树:树 中所含的 n 个结点 和满二叉树中编号 为 1 至 n 的结点一 一对应。123456789 10 11 12 13 14 15abcdefghij两类特殊的二叉树:证明:设 完全二叉树的深度为 k 则根据第二条性质得 2k-1 n n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点; (3) 若 2i+1n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。性质 5 :二. 二叉树的链式存储表示一. 二叉树的顺序存储表示6.3 二叉树的存储结构#define MA

7、X_TREE_SIZE 100 / 二叉树的最大结点数 typedef TElemType SqBiTreeMAX_TREE_SIZE; / 0号单元存储根结点 SqBiTree bt; 一. 二叉树的顺序存储表示A B D C E FABCDEF0 1 2 3 4 5 6 7 8 9 10 11 12 13 142511437例如:1. 二叉链表2三叉链表3双亲链表4线索链表二. 二叉树的链式存储表示ADEBCFrootlchild data rchild结点结构:1. 二叉链表typedef struct BiTNode / 结点结构TElemType data;struct BiTNod

8、e *lchild, *rchild; / 左、右孩子指针 BiTNode, *BiTree;lchild data rchild结点结构:C 语言的类型描述如下:ADEBCFrootparent lchild data rchild结点结构:2三叉链表typedef struct TriTNode / 结点结构TElemType data;struct TriTNode *lchild, *rchild; / 左、右孩子指针struct TriTNode *parent; /双亲指针 TriTNode, *TriTree;parent lchild data rchild结点结构:C 语言的

9、类型描述如下:L RR R L0 1 2 3 4 5 6data parent结点结构:LRTag3双亲链表typedef struct BPTNode / 结点结构TElemType data;int parent; / 指向双亲的指针char LRTag; / 左、右孩子标志域 BPTNodetypedef struct BPTree / 树结构BPTNode nodesMAX_TREE_SIZE;int num_node; / 结点数目int root; / 根结点的位置 BPTree6.4二叉树的遍历一、问题的提出二、先左后右的遍历算法三、算法的递归描述四、中序遍历算法的非递归描述五、

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

11、树为空树,则空操作;否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。先(根)序的遍历算法:若二叉树为空树,则空操作;否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。中(根)序的遍历算法:若二叉树为空树,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。后(根)序的遍历算法:void Preorder (BiTree T,void( *visit)(TElemType / 访问结点Preorder(T-lchild, visit); / 遍历左子树Preorder(T-rchild, visit);/ 遍历右子树 三. 算法的递

12、归描述BiTNode *GoFarLeft(BiTree T, Stack while (T-lchild ) / 直到最左端Push(S, T);T = T-lchild;return T; 四. 中序遍历算法的非递归描述abcdefghijvoid Inorder_I( BiTree T, void (*visit)(TelemType InitStack(S); t = GoFarLeft(T, S); / 找到最左下的结点while (t) visit(t-data);if (t-rchild) t = GoFarLeft(t-rchild, S);else if (!StackEmp

13、ty(S ) / 栈不空时退栈t = Pop(S);else t = NULL; / 栈空表明遍历结束 1. 统计二叉树中叶子结点的个数(先序遍历, 习题6.42) 2. 求二叉树的深度(后序遍历,参见习题6.44) 3. 复制二叉树(后序遍历,参见习题6.46)4.建立二叉树的存储结构五. 遍历算法的应用举例算法基本思想:先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。因此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点”的 操作改为:若是叶子,则计数器增1。1. 统计二叉树中叶子结点的个数 (习题6.42)void CountLeaf (BiTree T, i

14、nt / 对叶子结点计数CountLeaf( T-lchild, count); CountLeaf( T-rchild, count); 调用:调用:numnum0 0; CountLeafCountLeaf(T T,numnum););算法基本思想:从二叉树深度的定义可知,二叉树的 深度应为其左、右子树深度的最大值加1 。由此,需先分别求得左、右子树的深 度,算法中“访问结点”的操作为:求得 左、右子树深度的最大值,然后加 1 。首先分析二叉树的深度和它的左、 右子树深度之间的关系。2. 求二叉树的深度(后序遍历)(参见习题6.44)int Depth (BiTree T ) / 返回二叉

15、树的深度if ( !T ) depthval = 0;else depthLeft = Depth( T-lchild );depthRight= Depth( T-rchild );depthval = 1 + (depthLeft depthRight ?depthLeft : depthRight); return depthval; 其基本操作为:生成一个结点。根元素T左子树右子树根元素NEWT左子树右子树左子树右子树(后序遍历)3. 复制二叉树(参见习题6.46)BiTNode *GetTreeNode(TElemType item, BiTNode *lptr , BiTNode *rptr )if (!(T = (BiTNode*)malloc(sizeof(BiTNode)exit(1);T- data = item;T- lchild = lptr;

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

当前位置:首页 > 中学教育 > 教学课件

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