数据结构二叉树教学ppt课件.ppt
《数据结构二叉树教学ppt课件.ppt》由会员分享,可在线阅读,更多相关《数据结构二叉树教学ppt课件.ppt(151页珍藏版)》请在三一办公上搜索。
1、第六章 树和二叉树,6.1 树的类型定义,6.2 二叉树的类型定义,6.3 二叉树的存储结构,6.4 二叉树的遍历,6.5 线索二叉树,6.6 树和森林的表示方法,6.7 树和森林的遍历,6.8 哈夫曼树与哈夫曼编码,6.1 树的类型定义,数据对象 D:,D是具有相同特性的数据元素的集合。,若D为空集,则称为空树; 否则: (1) 在D中存在唯一的称为根的数据元素root, (2) 当n1时,其余结点可分为m (m0)个互 不相交的有限集T1, T2, , Tm, 其中每一 棵子集本身又是一棵符合本定义的树, 称为根root的子树。,数据关系 R:,基本操作:,查 找 类,插 入 类,删 除
2、类,Root(T) / 求树的根结点,查找类:,Value(T, cur_e) / 求当前结点的元素值,Parent(T, cur_e) / 求当前结点的双亲结点,LeftChild(T, cur_e) / 求当前结点的最左孩子,RightSibling(T, cur_e) / 求当前结点的右兄弟,TreeEmpty(T) / 判定树是否为空树,TreeDepth(T) / 求树的深度,TraverseTree( T, Visit() ) / 遍历,InitTree(&T) / 初始化置空树,插入类:,CreateTree(&T, definition) / 按定义构造树,Assign(T,
3、cur_e, value) / 给当前结点赋值,InsertChild(&T, &p, i, c) / 将以c为根的树插入为结点p的第i棵子树,ClearTree(&T) / 将树清空,删除类:,DestroyTree(&T) / 销毁树的结构,DeleteChild(&T, &p, i) / 删除结点p的第i棵子树,A,B,C,D,E,F,G,H,I,J,M,K,L,A( ),树根,例如:,B(E, F(K, L),C(G),D(H, I, J(M),() 有确定的根;() 树根和子树根之间为有向关系。,有向树:,有序树:,子树之间存在确定的次序关系。,无序树:,子树之间不存在确定的次序关系
4、。,基 本 术 语,结点:,结点的度:,树的度:,叶子结点:,分支结点:,数据元素+若干指向子树的分支,分支的个数,树中所有结点的度的最大值,度为零的结点,度大于零的结点,D,H,I,J,M,(从根到结点的)路径:,孩子结点、双亲结点、兄弟结点、堂兄弟祖先结点、子孙结点,结点的层次:,树的深度:,由从根到该结点所经分支和结点构成,假设根结点的层次为1,第l 层的结点的子树根结点的层次为l+1,树中叶子结点所在的最大层次,任何一棵非空树是一个二元组 Tree = (root,F)其中:root 被称为根结点, F 被称为子树森林,森林:,是 m(m0)棵互不相交的树的集合,A,root,F,对比
5、树型结构和线性结构的结构特点,线性结构,树型结构,第一个数据元素 (无前驱),根结点 (无前驱),最后一个数据元素 (无后继),多个叶子结点 (无后继),其它数据元素(一个前驱、 一个后继),其它数据元素(一个前驱、 多个后继),6.2 二叉树的类型定义,二叉树或为空树;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。,根结点,左子树,右子树,E,F,二叉树的五种基本形态:,N,空树,只含根结点,N,N,N,L,R,R,右子树为空树,L,左子树为空树,左右子树均不为空树,二叉树的主要基本操作:,查 找 类,插 入 类,删 除 类,Root(T); Value(T, e);
6、 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(); PostOrderTraverse(T, Visit(); LevelOrderTraverse(T, Visit();,InitBiTree(,ClearBiTree(,二叉树的重要特性,性质 1 : 在二叉树的第 i 层上至多有2i-1 个
7、结点。 (i1),用归纳法证明: 归纳基: 归纳假设: 归纳证明:,i = 1 层时,只有一个根结点, 2i-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
8、 + n1 + n2,又 二叉树上分支总数 b = n1 + 2n2,而 b = n-1 = n0 + n1 + n2 - 1,由此, n0 = n2 + 1,两类特殊的二叉树:,满二叉树:指的是深度为k且含有2k-1个结点的二叉树。,完全二叉树:树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。,性质 4 : 具有 n 个结点的完全二叉树的深度为 log2n +1,证明:,设 完全二叉树的深度为 k,则根据第二条性质得 2k-1 n 2k,即 k-1 log2 n k,因为 k 只能是整数,因此, k =log2n + 1,性质 5 :,若对含 n 个结点的完全二叉树从上
9、到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 i/2 的结点为其双亲结点; (2) 若 2in,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;(3) 若 2i+1n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。,6.3 二叉树的存储结构,二、二叉树的链式 存储表示,一、 二叉树的顺序 存储表示,#define MAX_TREE_SIZE 100 / 二叉树的最大结点数typedef TElemType SqBiTreeMAX_TREE_SIZE; /
10、0号单元存储根结点SqBiTree bt;,一、 二叉树的顺序存储表示,例如:,1,4,0,13,2,6,二、二叉树的链式存储表示,1. 二叉链表,2三叉链表,3双亲链表,4线索链表,root,结点结构:,1. 二叉链表,typedef struct BiTNode / 结点结构 TElemType data; struct BiTNode *lchild, *rchild; / 左右孩子指针 BiTNode, *BiTree;,结点结构:,C 语言的类型描述如下:,root,2三叉链表,结点结构:,typedef struct TriTNode / 结点结构 TElemType data;
11、struct TriTNode *lchild, *rchild; / 左右孩子指针 struct TriTNode *parent; /双亲指针 TriTNode, *TriTree;,结点结构:,C 语言的类型描述如下:,结点结构:,3双亲链表,LRTag,LRRRL,typedef struct BPTNode / 结点结构 TElemType data; int *parent; / 指向双亲的指针 char LRTag; / 左、右孩子标志域 BPTNode typedef struct BPTree / 树结构 BPTNode nodesMAX_TREE_SIZE; int num
12、_node; / 结点数目 int root; / 根结点的位置 BPTree,6.4二叉树的遍历,一、问题的提出,二、先左后右的遍历算法,三、算法的递归描述,四、中序遍历算法的非递归描述,四、遍历算法的应用举例,顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。,一、问题的提出,“访问”的含义可以很广,如:输出结点的信息等。,“遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构,,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径进行遍历的问题。,对“二叉树”而言,可以有三条搜
13、索路径:,1先上后下的按层次遍历;2先左(子树)后右(子树)的遍历;3先右(子树)后左(子树)的遍历。,二、先左后右的遍历算法,先(根)序的遍历算法,中(根)序的遍历算法,后(根)序的遍历算法,根,左子树,右子树,根,根,根,根,根,若二叉树为空树,则空操作;否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。,先(根)序的遍历算法:,若二叉树为空树,则空操作;否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。,中(根)序的遍历算法:,若二叉树为空树,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。,后(根)序的遍历算法:,例如:
14、,先序序列:,中序序列:,后序序列:,A B C D E F G H K,B D C A E H G K F,D C B H K G F E A,三、算法的递归描述,void Preorder (BiTree T, void( *visit)(TElemType/ 遍历右子树 ,四、中序遍历算法的非递归描述,有两种分析(描述)方法:,一、“任务书”分析方法,二、“路径”分析方法,在写算法之前首先需定义栈的元素类型。typedef enum Travel, Visit TaskType; / Travel = 1:遍历, / Visit = 0:访问 typedef struct BiTree
15、ptr; / 指向根结点的指针 TaskType task; / 任务性质 ElemType;,“遍历二叉树”包括三项子任务:,“遍历左子树”,“遍历右子树”,“访问根结点”,void InOrder_iter( BiTree BT ) / 利用栈实现中序遍历二叉树,T为指向二叉树的根结点的头指针 InitStack(S); e.ptr=BT; e.task=Travel; if(T) Push(S, e); / 布置初始任务 while(!StackEmpty(S) Pop(S,e); / 每次处理一项任务 if (e.task=Visit) visit(e.ptr); / 处理访问任务 e
16、lse if(!e.ptr) / 处理非空树的遍历任务 p=e.ptr; e.ptr=p-rchild; Push(S,e);/ 最不迫切任务进栈 e.ptr=p; e.task=Visit; Push(S,e); e.ptr=p-lchild; e.task=Travel; Push(S,e); /if /while/InOrder_iter,void Inorder_I(BiTree T, void (*visit) (TelemType / 栈空表明遍历结束 / while/ Inorder_I,t = GoFarLeft(t-rchild, S);,BiTNode *GoFarLeft
17、(BiTree T, Stack *S) if (!T ) return NULL; while (T-lchild ) Push(S, T); T = T-lchild; return T;,四、遍历算法的应用举例,2、统计二叉树中叶子结点的个数,3、求二叉树的深度(后序遍历),4、复制二叉树(后序遍历),5、建立二叉树的存储结构,1、查询二叉树中某个结点,1. 在二叉树不空的前提下,和根结点的元素进行比较,若相等,则找到返回 TRUE;,2. 否则在左子树中进行查找,若找到,则返回 TRUE;,3. 否则继续在右子树中进行查找,若找到,则返回 TRUE,否则返回 FALSE;,Status
18、 Preorder (BiTree T, ElemType x, BiTree &p) / 若二叉树中存在和 x 相同的元素,则 p 指向该结点并返回 OK,/ 否则返回 FALSE ,if (T) if (T-data=x) p = T; return OK, /if else return FALSE;,else if (Preorder(T-lchild, x, p) return OK; else return(Preorder(T-rchild, x, p) ;/else,2、统计二叉树中叶子结点的个数,算法基本思想:,先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数
19、。由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点” 的操作改为:若是叶子,则计数器增1。,void CountLeaf (BiTree T, int / if / CountLeaf,int CountLeaf (BiTree T)/返回指针T所指二叉树中所有叶子结点个数 if (!T ) return 0; if (!T-lchild /else / CountLeaf,int Count (BiTree T)/返回指针T所指二叉树中所有结点个数 if (!T ) return 0; if (!T-lchild /else / CountLeaf,3、求二叉树的深度(后序遍
20、历),算法基本思想:,从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加 1 。,首先分析二叉树的深度和它的左、右子树深度之间的关系。,int Depth (BiTree T ) / 返回二叉树的深度 if ( !T ) depthval = 0; else depthLeft = Depth( T-lchild ); depthRight= Depth( T-rchild ); depthval = 1 + (depthLeft depthRight ? depthLeft
21、: depthRight); return depthval;,void Depth(BiTree T , int level, int / 调用之前 level 的初值为 1。 / dval 的初值为 0.,4、复制二叉树,其基本操作为:生成一个结点。,根元素,T,左子树,右子树,NEWT,左子树,右子树,左子树,右子树,(后序遍历),BiTNode *GetTreeNode(TElemType item, BiTNode *lptr , BiTNode *rptr ) if (!(T = new BiTNode) exit(1); T- data = item; T- lchild = l
22、ptr; T- rchild = rptr; return T;,生成一个二叉树的结点(其数据域为item,左指针域为lptr,右指针域为rptr),BiTNode *CopyTree(BiTNode *T) if (!T ) return NULL; if (T-lchild ) newlptr = CopyTree(T-lchild); /复制左子树 else newlptr = NULL; if (T-rchild ) newrptr = CopyTree(T-rchild); /复制右子树 else newrptr = NULL; newT = GetTreeNode(T-data,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉 教学 ppt 课件

链接地址:https://www.31ppt.com/p-1350154.html