[ppt模板]Ch6 树和二叉树.ppt
《[ppt模板]Ch6 树和二叉树.ppt》由会员分享,可在线阅读,更多相关《[ppt模板]Ch6 树和二叉树.ppt(207页珍藏版)》请在三一办公上搜索。
1、1,知识回顾,线性表 一般的线性表 特殊的线性表:栈、队列线性表的扩展:数组、广义表特点:有序前趋、后继,2,第六章 树和二叉树,树是以分支关系定义的层次结构。树结构在客观世界广泛存在:在自然科学,如地理学领域,水系、地貌(等高线)、行政区划等都具有树结构关系;在社会人文领域,人类社会构成、组织机构等也具有树结构关系。,树型结构:非线性数据结构,4,要求,1.熟练掌握二叉树的结构特性。2.熟悉二叉树的各种存储结构的特点及适用范围。3.掌握各种遍历策略的递归算法,灵活运用遍历算法实现二叉树的其它操作。4.熟练掌握二叉树的线索化过程以及在中序线索化树上找给定结点的前驱和后继的方法。5.熟悉树的各种
2、存储结构及其特点,掌握树和森林与二叉树的转换方法。6.了解最优树的特性,掌握建立最优树和哈夫曼编码的方法。,6.1 树的定义和基本术语,6.2 二叉树,6.3 遍历二叉树和线索二叉树,6.4 树和森林,6.5 赫夫曼树与其应用,主要内容,6,6.1.1 树的定义,树(tree)是n(n0)个结点的有限集。在任意一棵非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,Tm,其中每一个集合本身又是一棵树,并且称为根的子树。,根,子树,树的表示法,图形表示法嵌套集合表示法广义表表示法凹入表示法左孩子右兄弟表示法,图形表示法,西安石油大
3、学,叶子,根,子树,嵌套集合表示法,(A(B(E(K,L),F),C(G),D(H(M),I,J)约定:根作为由子树森林组成的表的名字写在表的左边,广义表表示法,凹入表示法,又称目录表示法,左孩子右兄弟表示法,多叉树转为了二叉树,15,数据对象 D:,D是具有相同特性的数据元素的集合。,若D为空集,则称为空树。否则:(1)在D中存在唯一的称为根的数据元素root;(2)当n1时,其余结点可分为m(m0)个互 不相交的有限集T1,T2,Tm,其中每一 棵子集本身又是一棵符合本定义的树,称为根root的子树。,数据关系 R:,ADT Tree,16,基本操作:,查 找 类,插 入 类,删 除 类,
4、17,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()/遍历,18,InitTree(&T)/初始化置空树,插入类:,CreateTree(&T,definition)/按定义构造树,Assign(T,cur_e,value)/给当前结点赋值,Inser
5、tChild(&T,&p,i,c)/将以c为根的树插入为结点p的第i棵子树,19,ClearTree(&T)/将树清空,删除类:,DestroyTree(&T)/销毁树的结构,DeleteChild(&T,&p,i)/删除结点p的第i棵子树,20,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),T1,T3,T2,树根,例如:,21,()有确定的根;()树根和子树根之间为有向关系。,有向树:,有序树:,子树之间存在确定的次序关系。,无序树:,子树之间不存在确定的次序关系。,22,对比树型结构和线性结构的结构特点,线性结构,树型结构,第
6、一个数据元素(无前驱),根结点(无前驱),最后一个数据元素(无后继),多个叶子结点(无后继),其它数据元素(一个前驱、一个后继),其它数据元素(一个前驱、多个后继),对比树型结构和线性结构的结构特点,6.1.2 基本术语,25,结点:,结点的度:,树的度:,叶子结点:,分支结点:,数据元素+若干指向子树的分支,分支的个数,树中所有结点的度的最大值,度为零的结点,度大于零的结点,D,H,I,J,M,26,子孙:以某结点为根的子树中的任一结点。,A,B,C,D,E,F,G,H,I,J,M,K,L,孩子:结点的子树的根。,双亲:该结点称为孩子的双亲。,兄弟:同一个双亲的孩子之间互称兄弟。,祖先:从根
7、到该结点所经分支上的所有结点,27,有序树:子树之间存在确定的次序关系,无序树:子树之间不存在确定的次序关系,树的深度:树中结点的最大层次,堂兄弟:其双亲在同一层的结点,结点的层次:假设根结点的层次为1,第l 层的结点的子树根结点的层次为l+1,28,结点A的度:3结点B的度:2结点M的度:0,叶子:K,L,F,G,M,I,J,结点A的孩子:B,C,D结点B的孩子:E,F,结点I的双亲:D结点L的双亲:E,结点B,C,D为兄弟结点K,L为兄弟,树的度:3,结点A的层次:1结点M的层次:4,树的深度:4,结点F,G为堂兄弟,29,任何一棵非空树是一个二元组 Tree=(root,F)其中:roo
8、t 被称为根结点 F 被称为子树森林,森林:,是m(m0)棵互不相交的树的集合,A,root,B,C,D,E,F,G,H,I,J,M,K,L,F,6.2 二叉树,最简单的树二叉树,先研究最简单、最有规律的树,然后设法把一般的树转化为简单树。,解决思路:,树的操作实现比较复杂。,为何要重点研究每结点最多只有两个“叉”的树?二叉树的结构最简单,规律性最强;可以证明,所有树都能转为唯一对应的二叉树,不失一般性。,二叉树:或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。,A,B,C,D,E,F,G,H,K,根结点,左子树,右子树,二叉树的特点(1)每个结点至多有二棵子
9、树(即不存在度大于2的结点);(2)二叉树的子树有左、右之分,且其次序不能任意颠倒。,二叉树的五种基本形态:,空树,只含根结点,L,R,R,右子树为空树,L,左子树为空树,左右子树均不为空树,34,二叉树的主要基本操作:,查 找 类,插 入 类,删 除 类,35,Root(T);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();InOrderTravers
10、e(T,Visit();PostOrderTraverse(T,Visit();LevelOrderTraverse(T,Visit();,36,InitBiTree(,37,ClearBiTree(,38,二叉树的重要特性,39,性质 1:在二叉树的第 i 层上至多有2i-1 个结点。(i1),用归纳法证明:归纳基:归纳假设:归纳证明:,i=1 层时,只有一个根结点:2i-1=20=1;,假设对所有的 j,1 j i,命题成立;,二叉树上每个结点至多有两棵子树,则第 i 层的结点数=2i-2 2=2i-1。,40,性质 2:深度为 k 的二叉树上至多含 2k-1 个结点(k1)。,证明:,基
11、于性质1,深度为 k 的二叉树上的结点数至多为 20+21+2k-1=2k-1。,41,性质 3:对任何一棵二叉树,若它含有n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0=n2+1。,证明:二叉树中全部结点数nn0+n1+n2(叶子数1度结点数2度结点数)又二叉树中全部结点数nB+1(总分支数根结点)(除根结点外,每个结点必有一个直接前趋,即一个分支)而 总分支数B=n1+2n2(1度结点必有1个直接后继,2度结点必有2个)三式联立可得:n0+n1+n2=n1+2n2+1,即n0=n2+1,42,两类特殊的二叉树:,满二叉树:深度为k且含有2k-1个结点的二叉树。,完全二叉树
12、:树中所含的 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,43,44,完全二叉树特点:,(1)叶子结点只可能在层次最大的两层上出现;(2)对任一结点,若其右分支下子孙的最大层次为i,则其左分支下子孙的最大层次必为i或i+1。,满二叉树与完全二叉树的区别,满二叉树是叶子一个也不少的树,而完全二叉树虽然前k-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。为何要研究这两种特殊形式?因为它们在顺序存储方式下可以复原。,45,性质 4:具有
13、 n 个结点的完全二叉树的深度为 log2n+1。x 表示=x的最大整数。,证明:设完全二叉树的深度为 k 则根据第二条性质得 2k-1(第k层第一个结点的编号)n 2k(第k1层第一个结点的编号)即 k-1 log2 n k 因为 k 只能是整数,因此,k=log2n+1。,46,证明:,设完全二叉树的深度为 k,据定义,k-1层满,k层最少1个,n=(2k-1-1)+1,根据第二条性质得 n 2k-1,因此:2k-1 n 2k 即 k-1 log2 n k 因为 k 只能是整数,因此,k=log2n+1。,47,性质 5:,若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n
14、的编号,则对完全二叉树中任意一个编号为 i 的结点:(1)若 i=1,则该结点是二叉树的根,无双亲,否则,编号为 i/2 的结点为其双亲结点;(2)若 2in,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点;(3)若 2i+1n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。,第k层上最后一个结点的编号是2k-1,它的右孩子是第k+1层上最后一个结点,编号是2k+1-1,右孩子编号是它的双亲结点编号的(2k-1)*2+1,左孩子的编号是(2k-1)*2所以,编号为 i 的结点的左孩子结点编号是2i,右孩子结点编号是2i+1,双亲结点编号i/2,49,问 题,具有
15、n个结点的非空二叉树的最小深度是多少?最大深度是多少?,答1:当是满二叉树时深度最小。,最小深度:log2n+1,当每个节点都只有左(右)子树时深度最大,最大深度:n,50,思考题,1.具有n个结点的完全二叉树中有多少个叶子结点?有多少个度为2的结点?2.具有n0个叶子结点的完全二叉树中共有多少个结点?,51,二叉树的存储结构,二、二叉树的链式 存储表示,一、二叉树的顺序 存储表示,存储方式:用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在一维数组中下标为i-1的分量中。,一、二叉树的顺序存储结构,/-二叉树的顺序存储表示-#d
16、efine MAX_TREE_SIZE 100/二叉树的最大结点数typedef TElemType SqBiTreeMAX_ TREE_SIZE;/0号单元存储根结点SqBiTree bt;,例如:,A,B,C,D,E,F,A B D 0 C 0 E 0 0 0 0 0 0 F,0 1 2 3 4 5 6 7 8 9 10 11 12 13,1,4,0,13,2,6,0表示不存在此结点,完全二叉树的数组表示 一般二叉树的数组表示,55,特点:结点间关系蕴含在其存储位置中,浪费空间,适于存满二叉树和完全二叉树(在最坏情况下,深度为k且只有k个结点的单支树需要长度为2k-1的一维数组)。由于一般
17、二叉树必须仿照完全二叉树那样存储,可能会浪费很多存储空间,单支树就是一个极端情况。,二、二叉树的链式存储结构,(1)二叉链表,(2)三叉链表,A,D,E,B,C,F,root,lchild data rchild,结点结构:,1.二叉链表,F,在n个结点的二叉链表中,有n+1个空指针域,typedef struct BiTNode/结点结构 TElemType data;struct BiTNode*lchild,*rchild;/左右孩子指针 BiTNode,*BiTree;,lchild data rchild,结点结构:,C 语言的类型描述如下:,A,D,E,B,C,F,root,2三叉
18、链表,parent lchild data rchild,结点结构:,F,typedef struct TriTNode/结点结构 TElemType data;struct TriTNode*lchild,*rchild;/左右孩子指针 struct TriTNode*parent;/双亲指针 TriTNode,*TriTree;,parent lchild data rchild,结点结构:,C 语言的类型描述如下:,二叉链存储结构的二叉树操作实现,在二叉链存储结构下,针对一棵二叉树,主要涉及如下几个功能模块:二叉树的初始化操作;二叉树中给某结点插入一个左结点的操作;二叉树中给某结点插入一
19、个右结点的操作;删除二叉树中某结点的左子树操作;删除二叉树中某结点的右子树操作。各算法的基本思想及程序实现如下:typedef struct Node DataType data;struct Node*leftChild;struct Node*rightChild;BiTreeNode;/*结点的结构体定义*/,1.二叉树的初始化 算法的基本思想:创建二叉树的头结点。程序实现:void Initiate(BiTreeNode*root)*root=(BiTreeNode*)malloc(sizeof(BiTreeNode);(*root)-leftChild=NULL;(*root)-ri
20、ghtChild=NULL;,2.二叉树中给某结点插入一个左结点的操作,算法的基本思想:若当前结点(假设为curr)非空,在curr的左子树插入元素值为x的新结点,原curr所指结点的左子树成为新插入结点的左子树。若插入成功返回新插入结点的指针,否则返回空指针。,程序实现:BiTreeNode*InsertLeftNode(BiTreeNode*curr,DataType x)BiTreeNode*s,*t;if(curr=NULL)return NULL;t=curr-leftChild;s=(BiTreeNode*)malloc(sizeof(BiTreeNode);s-data=x;s-
21、leftChild=t;s-rightChild=NULL;curr-leftChild=s;return curr-leftChild;,3.删除二叉树中某结点的左子树操作,算法的基本思想:若curr非空,删除curr所指结点的左子树。若删除成功,返回删除结点的双亲结点指针,否则返回空指针。程序实现:BiTreeNode*DeleteLeftTree(BiTreeNode*curr)if(curr=NULL|curr-leftChild=NULL)return NULL;Destroy(,66,知识回顾,树和二叉树的定义二叉树的特点二叉树的存储结构,67,6.3.1二叉树的遍历,68,一、问
22、题的提出,二、先左后右的遍历算法,三、算法的递归描述,四、中序遍历算法的非递归描述,五、遍历算法的应用举例,69,顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。,一、问题的提出,“访问”的含义可以很广,如:输出结点的信息等。,70,“遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构,,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径遍历的问题。,71,对“二叉树”而言,可以有三条搜索路径:,1先上后下的按层次遍历;2先左(子树)后右(子树)的遍历;3先右(子树)后左(子树
23、)的遍历。,72,二、先左后右的遍历算法,先(根)序的遍历算法,中(根)序的遍历算法,后(根)序的遍历算法,73,若二叉树为空树,则空操作;否则,(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。,先(根)序的遍历算法:,74,若二叉树为空树,则空操作;否则,(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。,中(根)序的遍历算法:,75,若二叉树为空树,则空操作;否则,(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。,后(根)序的遍历算法:,76,T L R,先序遍历序列:A B D C,先序遍历:,77,L T R,中序遍历序列:B D A C,中序遍
24、历:,78,L R T,后序遍历序列:D B C A,后序遍历:,79,先序遍历:,中序遍历:,后序遍历:,-,+,a,*,b,-,c,d,/,e,f,-,+,a,*,b,-,c,d,/,e,f,-,+,a,*,b,-,c,d,/,e,f,80,三、算法的递归描述,void InorderTraverse(BiTree T,Status(*visit)(TElemType e)/中序遍历二叉树 if(T)InorderTraverse(T-lchild,visit);/中序遍历左子树 visit(T-data)/访问根结点 InorderTraverse(T-rchild,visit);/中序
25、遍历右子树,见演示,81,Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e)InitStack(S);Push(S,T);/根指针进栈While(!StackEmpty(S)While(GetTop(S,p)/InOrderTraverse,算法1,四、中序遍历算法的非递归描述,82,-,*,a,null,null,b,null,null,c,null,null,中序遍历序列:a*b-c,While(!StackEmpty(S)While(GetTop(S,p)/if,83,status InorderTraverse(BiT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ppt模板 ppt模板Ch6 树和二叉树 ppt 模板 Ch6 二叉

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