第6章 树和二叉树.ppt
《第6章 树和二叉树.ppt》由会员分享,可在线阅读,更多相关《第6章 树和二叉树.ppt(108页珍藏版)》请在三一办公上搜索。
1、第6章 树和二叉树,6.1 树的类型定义,6.2 二叉树的类型定义和实现,6.3 遍历二叉树和线索二叉树,6.4 树和森林,6.6 Huffman树与Huffman编码,6.5 树与等价问题,6.1 树的类型定义,树 是 n 个结点的有限集 D,当n1 时:1)有一个特定的结点 root 被称为根(结点);2)根以外的结点被分成 m(m0)个不相交的有限集 T1,T2,Tm,其中每个集合又是一棵树,称为根的子树。,树的定义是一个递归的定义,可以用广义表的形式描述:Tree=(root,T1,T2,Tm)其中 root 是结点类型,其余为树类型(广义表类型)。,对比树型结构和线性结构的结构特点,
2、线性结构,树型结构,第一个数据元素(无前驱),一个首元素(无前驱),最后一个数据元素(无后继),多个尾元素(无后继),其它数据元素(一个前驱、一个后继),其它数据元素(一个前驱、多个后继),基 本 术 语,结 点:数据元素+若干指向子树的分支。,结点的度:分支的个数。,树的度:树中所有结点的度的最大值。,叶子结点:度为零的结点。,分支结点:度大于零的结点。,(从根到结点的)路径:从根到该结点所经分支和结点构成的集合。,孩子结点、双亲结点、兄弟结点、堂兄弟、祖先结点、子孙结点,结点的层次:假设根结点的层次为 1,第 i 层的结点的子树的根结点的层次为 i+1。,树的深度:树中叶子结点所在的最大层
3、次。,森 林:是m(m0)棵互不相交的树的集合。,有向树:)有确定的根;)树根和子树根之间为有向关系。,有序树:子树之间存在确定的次序关系。,无序树:子树之间不存在确定的次序关系。,就逻辑结构而言,树是二元组:,Tree=(root,F),F 是 m(m0)棵子树的森林,F=(T1,T2,Tm),其中 Ti=(ri,Fi);当 m0 时,存在关系:RF=|i=1,2,m,m 0,树的抽象数据类型定义如下:,ADT Tree,若D为空集,则称为空树。否则:1)在D中存在唯一的称为根的数据元素 root;2)当n 1时,其余结点可分为 m(m0)个互不相交的有限集T1,T2,Tm,其中每个子集本身
4、又是符合本定义的一棵树,称为根 root 的子树。,数据对象:,D 是具有相同特性的数据元素的集合。,数据关系:,基本操作:,初始化操作,InitTree(&T)操作结果:初始化置空树。,DestroyTree(&T)初始条件:树 T 存在。操作结果:销毁树 T。,结构销毁操作,CreateTree(&T,definition)操作结果:按定义构造树。,引用型操作,Root(T)初始条件:树 T 存在。操作结果:求树的根结点。,Parent(T,cur_e)初始条件:树 T 存在。操作结果:用 cur_e 返回当前结点双亲的元素值。,Value(T,cur_e)初始条件:树 T 存在。操作结果
5、:用 cur_e 返回当前结点的元素值。,引用型操作(续),RightSibling(T,cur_e)初始条件:树 T 存在。操作结果:用 cur_e 返回当前结点右兄弟的元素值。,LeftSibling(T,cur_e)初始条件:树 T 存在。操作结果:用 cur_e 返回当前结点左兄弟的元素值。,引用型操作(续),TreeEmpty(T)初始条件:树 T 存在。操作结果:判定树是否为空树。,TraverseTree(T,Visit()初始条件:树 T 存在。操作结果:按照某种顺序用Visit访问所有的结点。,TreeDepth(T)初始条件:树 T 存在。操作结果:求树的深度。,加工型操作
6、,DeleteChild(&T,&p,i)初始条件:树 T 存在,1 i Degree(p)。操作结果:删除结点p的第i棵子树。,InsertChild(&T,&p,i,c)初始条件:树 T 存在,且 i 1。操作结果:将以c为根的树插入为结点p的第i棵子树。,加工型操作(续),ClearTree(&T)初始条件:树 T 存在。操作结果:清空树中的所有结点。,ADT Tree,Assign(T,&cur_e,value)初始条件:树 T 存在。操作结果:用 value 给当前结点 cur_e 赋值。,6.2 二叉树的类型定义和实现,二叉树中每个结点至多只有 2 棵子树,二叉树的子树有左右之分。
7、,二叉树的五种基本形态:,空树,左右子树均为空树,右子树为空树,左子树为空树,左右子树均不为空树,二叉树的抽象数据类型定义如下:,若D为空集,则称为空树。否则:1)在D中存在唯一的称为根的数据元素 root;2)当n 1时,其余结点可分为2个互不相交的有限集T1,T2,其中每一棵子集本身又是一棵符合本定义的二叉树,T1称为根 root 的左子树,T2称为根 root 的右子树,,ADT BinaryTree,数据对象:,D 是具有相同特性的数据元素的集合。,数据关系:,基本操作:,初始化操作,InitBiTree(&T)操作结果:初始化置空二叉树。,DestroyBiTree(&T)初始条件:
8、二叉树 T 存在。操作结果:销毁二叉树 T。,结构销毁操作,CreateBiTree(&T,definition)操作结果:按定义构造二叉树。,引用型操作,Root(T)初始条件:二叉树 T 存在。操作结果:求二叉树的根结点。,Parent(T,e)初始条件:二叉树 T 存在。操作结果:用 e 返回当前结点双亲的元素值。,Value(T,e)初始条件:二叉树 T 存在。操作结果:用 e 返回当前结点的元素值。,引用型操作(续),LeftChild(T,e)初始条件:二叉树 T 存在。操作结果:用 e 返回当前结点左孩子的元素值。,RightChild(T,e)初始条件:二叉树 T 存在。操作结
9、果:用 e 返回当前结点右孩子的元素值。,引用型操作(续),RightSibling(T,e)初始条件:二叉树 T 存在。操作结果:用 e 返回当前结点右兄弟的元素值。,LeftSibling(T,e)初始条件:二叉树 T 存在。操作结果:用 e 返回当前结点左兄弟的元素值。,引用型操作(续),BiTreeEmpty(T);初始条件:二叉树 T 存在。操作结果:判定二叉树是否为空树。,BiTreeDepth(T)初始条件:二叉树 T 存在。操作结果:求二叉树的深度。,PreOrderTraverse(T,Visit()初始条件:二叉树 T 存在。操作结果:按照先序用Visit遍历二叉树中的所有
10、结点。,InOrderTraverse(T,Visit()初始条件:二叉树 T 存在。操作结果:按照中序用Visit遍历二叉树中的所有结点。,引用型操作(续),PostOrderTraverse(T,Visit()初始条件:二叉树 T 存在。操作结果:按照后序用Visit遍历二叉树中的所有结点。,LevelOrderTraverse(T,Visit()初始条件:二叉树 T 存在。操作结果:按照层次用遍历Visit二叉树中的所有结点。,引用型操作(续),加工型操作,InsertChild(&T,&p,LR,c)初始条件:二叉树 T 存在。操作结果:根据LR的值,将以c为根的树插入为结点p的子树。
11、,DeleteChild(T,p,LR);初始条件:二叉树 T 存在。操作结果:根据LR的值,删除结点p的子树。,加工型操作(续),ClearBiTree(&T)初始条件:二叉树 T 存在。操作结果:清空二叉树中的所有结点。,ADT BinaryTree,Assign(T,&e,value)初始条件:二叉树 T 存在。操作结果:用 value 给当前结点 e 赋值。,二叉树的重要特性,性质 1 在二叉树的第 i 层上至多有2i-1 个结点(i1),证明:用归纳法证明,,i=1层时,只有一个根结点:2i-1=20=1;假设对所有的 j,1ji,命题成立,二叉树上每个结点至多有两棵子树,则第 i
12、层的结点数=2i-22=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=n2+1。,除根结点外,每个结点指向双亲结点的分支只有一条。,两类特殊的二叉树:,满二叉树(Full Binary Tree):指的是深度为
13、k 且含有 2k-1 个结点的二叉树。,完全二叉树(Complete Binary Tree):树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。,性质4 具有 n 个结点的完全二叉树的深度为 log2n+1,证明:,设完全二叉树的深度为 k,则根据性质 2 得 2k-1 n 2k,log2n为递增函数,log2n k log2n+1,k 必须为整数,因此,k=log2n+1。,性质 5 若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:,1)若 i=1,则该结点是二叉树的根,无双亲,否则,编号为 i/2
14、的结点为其双亲结点;2)若 2i n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点;3)若 2i+1 n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。,二叉树的存储结构,#define MAX_TREE_SIZE 100/二叉树的最大结点数typedef TElemType SqBiTreeMAX_TREE_SIZE;/0 号单元存储根结点SqBiTree bt;,1.二叉树的顺序存储表示,按照依次自上而下、自左至右的顺序,存储完全二叉树结点的元素值。一般二叉树则按完全二叉树编号后存储,编号处无结点的位置不存储。,例6-2 顺序表示下列二叉树,0,1,2,3
15、,4,5,6,7,8,9,10,11,12,13,2.二叉树的链式存储表示,二叉链表,结点结构:,typedef struct BiTNode/结点结构 TElemType data;struct BiTNode*lchild,*rchild;/左右孩子指针 BiTNode,*BiTree;,typedef struct TriTNode/结点结构 TElemType data;struct TriTNode*lchild,*rchild;/左右孩子指针 struct TriTNode*parent;/双亲指针 TriTNode,*TriTree;,结点结构:,三叉链表,6.3 遍历二叉树和线
16、索二叉树,顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。,二叉树由根、左子树和右子树组成。对二叉树而言,可以有三条搜索路径:1)先(根)序遍历:根 左子树 右子树(TLR)2)中(根)序遍历:左子树 根 右子树(LTR)3)后(根)序遍历:左子树 右子树 根(LRT),一.遍历二叉树,若二叉树为空树,则空操作;否则,1)访问根结点;2)先序遍历左子树;3)先序遍历右子树。,1.先(根)序的遍历算法:,访问路径描述:从根结点开始,沿着左子树方向依次访问,当左子树遍历完成,从左子树退回时访问每个结点的右子树。,例6-3 先序遍历下列二叉树,遍历结果(先序序列)为
17、,a b d e h I j k c f g,先序序列的特点:,1)首结点为根结点2)无法区分左右子树,void Preorder(BiTree T,void(*visit)(TElemType/遍历右子树/Preorder,算法的递归描述:,void Preorder(BiTree T,void(*visit)(TElemType/while/Preorder,算法的非递归描述:,若二叉树为空树,则空操作;否则,1)中序遍历左子树;2)访问根结点;3)中序遍历右子树。,2.中(根)序的遍历算法:,访问路径描述:沿着左子树方向找到最“左边”的结点作为起点,从左子树退回时依次访问每个结点及其右子
18、树。,例6-4 中序遍历下列二叉树,遍历结果(中序序列)为,d b h e j i k a f c g,中序序列的特点:,1)无法确定根结点2)若已知根结点,可区分左右子树,void Inorder(BiTree T,void(*visit)(TElemType/遍历右子树/Inorder,算法的递归描述:,void Inorder(BiTree T,void(*visit)(TElemType/while/Inorder,算法的非递归描述:,若二叉树为空树,则空操作;否则,1)后序遍历左子树;2)后序遍历右子树;3)访问根结点。,3.后(根)序的遍历算法:,访问路径描述:找到最“左边”的叶子
19、结点作为起点,每次经过一个结点时需要判断:如果是从左子树返回,则进入右子树;如果从右子树返回,则访问该结点并后退。判断的方法是看该结点的右子树的根是否为刚刚访问的那个结点。,例6-5 后序遍历下列二叉树,遍历结果(后序序列)为,d h j k i e b f g c a,后序序列的特点:,1)尾结点为根结点2)无法区分左右子树,void Postorder(BiTree T,void(*visit)(TElemType/访问结点/Postorder,算法的递归描述:,void Postorder(BiTree T,void(*visit)(TElemType/用q保存刚访问的结点/else/w
20、hile/Postorder,算法的非递归描述:,例6-6 写出二叉树的三种遍历序列,先序序列:ABDEGCFHI,中序序列:DBGEACHFI,后序序列:DGEBHIFCA,由二叉树的前序序列和中序序列可以唯一确定这棵二叉树。由二叉树的后序序列和中序序列可以唯一确定这棵二叉树。由二叉树的前序序列和后序序列不能唯一确定这棵二叉树。,结论:,例6-7 已知一棵二叉树的先序序列为 ABHFDECKG 和中序序列 HBDFAEKCG,求这棵二叉树,1)根结点 A,2)左子树中序序列 HBDF,右子树中序序列 EKCG,3)左子树先序序列 BHFD,右子树先序序列 ECKG,先序遍历结果(先序序列)-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 树和二叉树 二叉

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