数据结构树和二叉树图文电子教案

上传人:yulij****0329 文档编号:139796116 上传时间:2020-07-24 格式:PPT 页数:180 大小:2.52MB
返回 下载 相关 举报
数据结构树和二叉树图文电子教案_第1页
第1页 / 共180页
数据结构树和二叉树图文电子教案_第2页
第2页 / 共180页
数据结构树和二叉树图文电子教案_第3页
第3页 / 共180页
数据结构树和二叉树图文电子教案_第4页
第4页 / 共180页
数据结构树和二叉树图文电子教案_第5页
第5页 / 共180页
点击查看更多>>
资源描述

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

1、第6章 树和二叉树,6.1 树的类型定义,6.2 二叉树的类型定义,6.3 二叉树的存储结构,6.4 二叉树的遍历,6.5 线索二叉树,6.6 树和森林的表示方法,6.8 二叉排序树及其平衡化,6.7 哈夫曼树与哈夫曼编码,6.1 树的类型定义,数据对象 D:,D是具有相同特性的数据元素的集合。,若D为空集,则称为空树 。 否则: (1) 在D中存在唯一的称为根的数据元素root; (2) 当n1时,其余结点可分为m (m0)个互 不相交的有限集T1, T2, , Tm,其中每一 棵子集本身又是一棵符合本定义的树, 称为根root的子树。,数据关系 R:,Root(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() ) / 遍历,InitTree( Value(T, e); Parent(T, e); LeftChild(T, e); RightChild(T, e); LeftSibling(T, e); Rig

3、htSibling(T, e); BiTreeEmpty(T); BiTreeDepth(T); PreOrderTraverse(T, Visit(); InOrderTraverse(T, Visit(); PostOrderTraverse(T, Visit(); LevelOrderTraverse(T, Visit();,InitBiTree(,ClearBiTree(,二叉树的重要特性,性质 1 :在二叉树的第 i 层上至多有2i-1 个结点。 (i1),用归纳法证明: 归纳基: 归纳假设: 归纳证明:,i = 1 层时,只有一个根结点: 2i-1 = 20 = 1;,假设对所有的

4、 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 - 1 由此, n0

5、 = n2 + 1 。,两类特殊的二叉树:,满二叉树:指的是深度为k且含有2k-1个结点的二叉树。,完全二叉树:树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,a,b,c,d,e,f,g,h,i,j,性质 4 :具有 n 个结点的完全二叉树的深度为 log2n +1 。,证明:,设完全二叉树的深度为 k 则根据第二条性质得 2k-1 n 2k 即 k-1 log2 n k 因为 k 只能是整数,因此, k =log2n + 1 。,性质 5 :,若对含 n 个结点的完全二叉树从上到下且从左至右进行

6、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; / 0号单元存储根结点

7、 SqBiTree bt;,一、 二叉树的顺序存储表示,例如:,A,B,C,D,E,F,A B D C E F,0 1 2 3 4 5 6 7 8 9 10 11 12 13,1,4,0,13,2,6,二、二叉树的链式存储表示,1. 二叉链表,2三叉链表,3双亲链表,4线索链表,A,D,E,B,C,F,root,lchild data rchild,结点结构:,1. 二叉链表,typedef struct BiTNode / 结点结构 TElemType data; struct BiTNode *lchild, *rchild; / 左右孩子指针 BiTNode, *BiTree;,lchi

8、ld data rchild,结点结构:,C 语言的类型描述如下:,A,D,E,B,C,F,root,2三叉链表,parent lchild data rchild,结点结构:,typedef struct TriTNode / 结点结构 TElemType data; struct TriTNode *lchild, *rchild; / 左右孩子指针 struct TriTNode *parent; /双亲指针 TriTNode, *TriTree;,parent lchild data rchild,结点结构:,C 语言的类型描述如下:,0 1 2 3 4 5 6,data parent

9、,结点结构:,3双亲链表,LRTag,L R R R L,typedef struct BPTNode / 结点结构 TElemType data; int *parent; / 指向双亲的指针 char LRTag; / 左、右孩子标志域 BPTNode typedef struct BPTree / 树结构 BPTNode nodesMAX_TREE_SIZE; int num_node; / 结点数目 int root; / 根结点的位置 BPTree,6.4 二叉树的遍历,一、问题的提出,二、先左后右的遍历算法,三、算法的递归描述,四、中序遍历算法的非递归描述,五、遍历算法的应用举例,

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

11、二叉树为空树,则空操作;否则, (1)访问根结点; (2)先序遍历左子树; (3)先序遍历右子树。,先(根)序的遍历算法:,若二叉树为空树,则空操作;否则, (1)中序遍历左子树; (2)访问根结点; (3)中序遍历右子树。,中(根)序的遍历算法:,若二叉树为空树,则空操作;否则, (1)后序遍历左子树; (2)后序遍历右子树; (3)访问根结点。,后(根)序的遍历算法:,三、算法的递归描述,void Preorder (BiTree T, void( *visit)(TElemType/ 遍历右子树 ,四、算法的非递归描述,A,B,C,D,E,F,中序遍历算法的非递归描述,BiTNode *

12、GoFarLeft(BiTree T, Stack *S) if (!T ) return NULL; while (T-lchild ) Push(S, T); T = T-lchild; return T; ,void Inorder_I(BiTree T, void (*visit) (TelemType / 栈空表明遍历结束 / while / Inorder_I,层次遍历二叉树,层次遍历二叉树,是从根结点开始遍历,按层次次序“自上而下,从左至右”访问树中的各结点。 为保证是按层次遍历,必须设置一个队列,初始化时为空。 设T是指向根结点的指针变量,层次遍历非递归算法是: 若二叉树为空,

13、则返回;否则,令p=T,p入队; 队首元素出队到p; 访问p所指向的结点; 将p所指向的结点的左、右子结点依次入队。直到队空为止。,#define MAX_NODE 50 void LevelorderTraverse( BTNode *T) BTNode *QueueMAX_NODE ,*p=T ; int front=0 , rear=0 ; if (p!=NULL) Queue+rear=p; /* 根结点入队 */ while (frontdata ); if (p-Lchild!=NULL) Queue+rear=p; /* 左结点入队 */ if (p-Rchild!=NULL)

14、Queue+rear=p; /* 左结点入队 */ ,6.5线索二叉树,何谓线索二叉树? 线索链表的遍历算法 如何建立线索链表?,一、何谓线索二叉树?,遍历二叉树的结果是, 求得结点的一个线性序列。,A,B,C,D,E,F,G,H,K,例如:,先序序列: A B C D E F G H K,中序序列: B D C A H G K F E,后序序列: D C B H K G F E A,指向该线性序列中的“前驱”和“后继” 的指针,称作“线索”,与其相应的二叉树,称作 “线索二叉树”,包含 “线索” 的存储结构,称作 “线索链表”,A B C D E F G H K, D ,C , B,E ,对

15、线索链表中结点的约定:,在二叉链表的结点中增加两个标志域, 并作如下规定:,若该结点的左子树不空, 则Lchild域的指针指向其左子树, 且左标志域的值为“指针 Link”; 否则,Lchild域的指针指向其“前驱”, 且左标志的值为“线索 Thread” 。,若该结点的右子树不空, 则rchild域的指针指向其右子树, 且右标志域的值为 “指针 Link”; 否则,rchild域的指针指向其“后继”, 且右标志的值为“线索 Thread”。,如此定义的二叉树的存储结构称作“线索链表”。,typedef struct BiThrNod TElemType data; struct BiThrNode *lchild, *rchild; / 左右指针 PointerThr LTag, RTag; / 左右标志 BiThrNode, *BiThrTree;,线索链表的类型描述:,typedef enum Link, Thread PointerThr; / Link=0:指针,Thread=1:线索,二、线索链表的遍历算法:,fo

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

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

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