第6章树和二叉树数据结构.ppt
《第6章树和二叉树数据结构.ppt》由会员分享,可在线阅读,更多相关《第6章树和二叉树数据结构.ppt(185页珍藏版)》请在三一办公上搜索。
1、第5章 树,2023/9/4,2,第6章 树,6.1 树的概念及操作6.2 二叉树 6.2.1 二叉树的概念及操作 6.2.2 二叉树的性质6.2.3 二叉树的存储结构6.3 二叉树的遍历6.4 线索二叉树6.5 树和森林 6.5.1 树的存储结构 6.5.2 森林、树、二叉树的相互转换 6.5.3 树和森林的遍历6.6 哈夫曼树及其应用 6.6.1 最优二叉树(哈夫曼树)6.6.2 哈夫曼编码*6.7算法设计举例,2023/9/4,3,主要内容,知识点树和二叉树定义二叉树的性质,存储结构二叉树的遍历及遍历算法的应用*线索二叉树二叉树和树及森林的关系Huffman树与Huffman编码重点难点
2、二叉树的性质及应用二叉树的遍历算法及应用*线索二叉树的算法Huffman树的构造方法树的算法,2023/9/4,4,树例与特征,社会的组织结构家族的族谱计算机中的目录组织,描述层次结构,是一种一对多的逻辑关系,2023/9/4,5,树的定义,树(Tree)是n(n=0)个结点的有限集。n=0时称为空树。(注:有人定义树不能为空)有且仅有一个称为根的结点(Root);n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,Tm,其中每个集合又是一棵树,称为子树(SubTree),2023/9/4,6,树的定义,树的递归定义的各子树T1,T2,Tm的相对次序是重要的,即树是有序的。,2023
3、/9/4,7,树定义(图示),T1,T2,T3,2023/9/4,8,树的抽象数据类型的定义,ADT Tree数据对象 D:D是具有相同特性的数据元素的集合。数据关系 R:若D为空集,则称为空树;若D仅含有一个数据元素,则R为空集,否则R=H,H是如下定义的二元关系:(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;(2)若D-root,则存在D-root的一个划分D1,D2,Dm(m0),对任意jk(1j,km)有DjDk=,且对任意的i(1 i m),存在唯一数据元素xi Di,H;(3)对应于D-root的划分,H-,有唯一的一个划分H1,H2,Hm(m0),对任意jk
4、(1j,km)有HjHk=,且对任意i(1 i m),Hi是Di上的二元关系,(Di,Hi)是一棵符合本定义的树,称为根root的子树。(转下页),2023/9/4,9,Tree();Tree();BuildRoot(const T/在结点 p 下插入值为 value 的新子女,若插/入失败,函数返回false,否则返回true,树的抽象数据类型(续),bool DeleteChild(position p,int i);/删除结点 p 的第 i 个子女及其全部子孙结/点,若删除失败,则返回false,否则返回true void DeleteSubTree(position t);/删除以 t
5、 为根结点的子树 bool IsEmpty();/判树空否,若空则返回true,否则返回false void Traversal(void(*visit)(position p);/遍历以 p 为根的子树ADT Tree,2023/9/4,10,树的抽象数据类型(续),2023/9/4,11,树的其它表示方式,凹入表示,嵌套集合,广义表,A(B(E,F),C,D(G(J),H,I),2023/9/4,12,结点:一个数据元素及若干指向其子树的分支;结点的度:结点拥有的子树的数目。树的度:树内各结点的度的最大值;叶子(终端结点):度为0的结点;分支结点(非终端结点):度不为0的结点;除根结点外,
6、也称内部结点;孩子,双亲,兄弟,堂兄:结点的子树的根称为该结点的孩子;该结点称为孩子的双亲;同一个双亲的孩子之间互称兄弟;其父结点是兄弟的结点互称堂兄。,树的概念,2023/9/4,13,概念,祖先:从根结点到该结点所经分支上的所有结点。子孙:以某结点为根的子树中的任一结点都称为该结点的子孙。层次:结点在树结构中的层(一般定义根为1层)。深度:树中结点的最大层次称为树的深度。有序树:结点的子树在树中的位置固定,不能互换,称有序树。无序树:子树在树中的位置可以互换。树的度:结点度的最大值森林:m(m0)棵互不相交的树的集合。,2023/9/4,14,概念示例,结点结点的度(Degree)叶子(L
7、eaf)或终端结点分支结点或非终端结点树的度层次(Level)树的深度(Depth)孩子(child)双亲(Parent)兄弟(Sibling)祖先子孙,树的示例,2023/9/4,15,自测题 1,n(n0)个结点的树的高度:最低是多少?最高是多少?,2023/9/4,16,二叉树的概念,二叉树(Binary Tree):或者是一棵空树,或者是一棵由一个根结点和两棵互不相交的左子树和右子树所组成的非空树,左子树和右子树同样也都是二叉树 特征:每个结点最多只有两棵子树子树有左右之分,其次序不能任意颠倒,只有一棵子树时也必须分清是左、右子树。,2023/9/4,17,二叉树的抽象数据类型,ADT
8、 BinaryTree 数据对象D:D是具有相同特性的数据元素的集合。数据关系R:若D=,则R=,称二叉树为空二叉树;若D,则R=H,H是如下二元关系:(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;(2)若D-root,则存在D-root=D1,Dr,且D1Dr;(3)若D1,则D1中存在唯一的元素x1,H,且存在D1上的关系H1H;若Dr,则Dr中存在唯一的元素xr,H,且存在Dr上的关系HrH;H=,H1,Hr;(4)(D1,H1)是一棵符合本定义的二叉树,称为根的左子树,(Dr,Hr)是一棵符合本定义的二叉树,称为根的右子树。基本操作如下:,2023/9/4,18,
9、二叉树的抽象数据类型(续),BinTreeNode*Parent(BinTreeNode*t);/求结点 t 的双亲BinTreeNode*LeftChild(BinTreeNode*t);/求结点 t 的左子女BinTreeNode*RightChild(BinTreeNode*t);/求结点 t 的右子女BinTreeNode*getRoot();/取根void preOrder(void(*visit)(BinTreeNode*t);/前序遍历,visit是访问函数void inOrder(void(*visit)(BinTreeNode*t);/中序遍历,visit是访问函数void
10、postOrder(void(*visit)(BinTreeNode*t);/后序遍历,(*visit)是访问函数void levelOrder(void(*visit)(BinTreeNode*t);/层次序遍历,visit是访问函数 int Height();/求树深度或高度 int Size();/求树中结点个数bool Insert(T item);/在树中插入新元素bool Remove(T item);/在树中删除元素bool Find(T/取得结点数据ADT BinaryTree,2023/9/4,19,二叉树的五种形态,2023/9/4,20,二叉树的性质,1.一个非空二叉树的
11、第i层上至多有2i-1个结点(i1)证明:i=1,只有根结点,显然成立 设i=k时成立,最多有2k-1个结点 当i=k+1时,最多的结点个数:2k-1*2=2k-1+1=2k=2(k+1)-1,2023/9/4,21,2.深度为k的二叉树至多有2k-1个结点(k1),二叉树的性质(续),证明:二叉树的结点个数为:1+2+2k-1=2k-1,2023/9/4,22,二叉树的性质(续),3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。,证明:设n1为T中度为1的结点数,则总结点数:n=n0+n1+n2(1)另:除根结点外,所有结点都有且仅有一个双亲结点,也就
12、是仅有一个分支进入,若B为分支数,则n=B+1=n1+2*n2+1(2)由(1)和(2)有:n1+2*n2 1=n0+n1+n2 故 n0=n2+1;,2023/9/4,23,满二叉树,满二叉树:深度为k且有2k-1个结点的二叉树,满二叉树,考虑到有序性,任一结点在树中都有确切的位置,因此可以对满二叉树进行编号。编号方式为:从上到下,从左到右。,2023/9/4,24,完全二叉树,完全二叉树:深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树编号从1到n的结点一一对应时,称为完全二叉树。,完全二叉树,2023/9/4,25,完全二叉树的树形特征,特征:叶子结点只可能在层次
13、最大的两层上出现。任一结点,若其左分支下的子孙的最大层次为l,则其右分支下的最大层次为l或l-1,即若结点无左子女,决不应有右子女。,2023/9/4,26,完全二叉树的特性(1),1.具有n个结点的完全二叉树的深度:k=,证明:假设n个结点的完全二叉树的深度为k,则n的值应大于深度为k-1的满二叉树的结点数2k-1-1,小于等于深度为k的满二叉树的结点数2k-1,即 2k-1-1n2k-1 进一步可推导出 2k-1n+12k两边取对数后,有 k-1log2(n+1)k因为k是整数,所以有k,2023/9/4,27,完全二叉树的特性(2),2.如果将一棵有n个结点的完全二叉树自顶向下,同一层自
14、左向右连续给结点编号1,2,3,n,则对任一结点i(1in)有(a)如果i=1,此结点为根结点,无双亲;若i1,则其双亲结点是i/2。(b)如果2in,则结点i无左孩子,i为叶子结点,否则其左孩子是结点2i。(c)如果2i+1n,则结点i无右孩子,否则其右孩子是结点2i+1。,2023/9/4,28,完全二叉树的特性(2)的示意图,2023/9/4,29,完全二叉树的特性(2)的示意图,2023/9/4,30,自测题 2,n(n0)个结点的二叉树的高度:最低是多少?最高是多少?,2023/9/4,31,自测题 3,有关二叉树下列说法正确的是()A二叉树的度为2 B一棵二叉树的度可以小于2 C二
15、叉树中至少有一个结点的度为2 D二叉树中任何一个结点的度都为2【南京理工大学 2000 一.11(1.5分)】,2023/9/4,32,自测题,5.已知一棵完全二叉树的第6层(设根是第1层)有8个叶结点,则该完全二叉树的结点个数最多是A.39 B.52 C.111 D.119【2009年全国硕士研究生入学计算机学科专业基础综合试题】,2023/9/4,33,完全二叉树性质的推论,n个结点的完全二叉树中:度为1的结点数为(n+1)%2;度为0的结点数为(n+1)/2;度为2的结点数为(n+1)/2-1;编号最大的分支结点是n/2;编号最小的叶子结点是n/2+1。n个结点的二叉树:高最多为n;最低
16、为(完全二叉树)。,2023/9/4,34,树的叶子数与其它结点数的关系,设度为m的树中度为0,1,2,m的结点数分别为n0,n1,n2,nm,结点总数为n,分枝数为B,则下面二式成立n=n0+n1+n2+nm(1)n=B+1=n1+2n2+mnm(2)由(1)和(2)得叶子结点数n0=1+,2023/9/4,35,二叉树的存储结构,顺序存储结构链式存储结构,2023/9/4,36,二叉树的顺序存储结构,整个二叉树可以按照从上到下,从左到右的顺序编号;对于满/完全二叉树,可以从根结点开始按序号存放;对于一般的二叉树,可以参照满二叉树的编号方法进行编号,位置空的结点为“虚结点”。,2023/9/
17、4,37,顺序存储结构举例,完全二叉树,2023/9/4,38,顺序存储结构举例,一般二叉树,2023/9/4,39,顺序存储结构举例,A,B,C,非完全二叉树,X,2023/9/4,40,二叉树的链式存储结构,二叉链表三叉链表(线索链表),data,lchild rchild,data,lchild rchild,parent,2023/9/4,41,链式存储结构示例,二叉链表,三叉链表,42,二叉树的类定义,/构造函数 lefttemplate struct BinTreeNode/二叉树结点类定义 T data;/数据域 BinTreeNode*leftChild,*rightChild
18、;/左子女、右子女链域 BinTreeNode()Child=NULL;rightChild=NULL;BinTreeNode(T x,BinTreeNode*l=NULL,BinTreeNode*r=NULL)data=x;leftChild=l;rightChild=r;,43,template class BinaryTree/二叉树类定义public:BinaryTree():root(NULL)/构造函数 BinaryTree(T value):RefValue(value),root(NULL)/构造函数 BinaryTree(BinaryTree/求结点数,44,BinTreeN
19、ode*Parent(BinTreeNode*t)return(root=NULL|root=t)?NULL:Parent(root,t);/返回双亲结点 BinTreeNode*LeftChild(BinTreeNode*t)return(t!=NULL)?t-leftChild:NULL;/返回左子女 BinTreeNode*RightChild(BinTreeNode*t)return(t!=NULL)?t-rightChild:NULL;/返回右子女 BinTreeNode*getRoot()const return root;/取根,45,void preOrder(void(*vi
20、sit)(BinTreeNode*t)preOrder(root,visit);/前序遍历 void inOrder(void(*visit)(BinTreeNode*t)inOrder(root,visit);/中序遍历 void postOrder(void(*visit)(BinTreeNode*t)postOrder(root,visit);/后序遍历 void levelOrder(void(*visit)(BinTreeNode*t);/层次序遍历 int Insert(const T item);/插入新元素 BinTreeNode*Find(T item)const;/搜索,4
21、6,protected:BinTreeNode*root;/二叉树的根指针 T RefValue;/数据输入停止标志 void CreateBinTree(istream/查找,47,BinTreeNode*Copy(BinTreeNode*r);/复制 int Height(BinTreeNode*subTree);/返回树高度 int Size(BinTreeNode*subTree);/返回结点数 BinTreeNode*Parent(BinTreeNode*subTree,BinTreeNode*t);/返回父结点 BinTreeNode*Find(BinTreeNode*subTre
22、e,T/搜寻x,48,void Traverse(BinTreeNode*subTree,ostream/后序遍历,2023/9/4,49,自测题 4,一棵124个叶结点的完全二叉树,最多有()个结点。A.247 B.248 C.249;D.250;E.251【中国科学技术大学1995十四.3(2分)】,2023/9/4,50,自测题 5,已知一棵完全二叉树中共有626个结点,叶子结点的个数应为()。A.311 B.312 C.313 D.314 E.其它【上海交通大学2005四.6(2分)】,2023/9/4,51,自测题 6,一个具有1025个结点的二叉树的高h为()A11 B10 C11
23、至1025之间 D10至1024之间【南京理工大学1999 一.19(2分)】,2023/9/4,52,自测题 7,一棵树高为K的完全二叉树至少有()个结点A.2k 1 B.2k-1 1 C.2k-1 D.2k【南京理工大学 1998 一.3(2分)】,2023/9/4,53,自测题 8,已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该树有_个叶子结点。【厦门大学 2000 六.2(16%/3分)】,2023/9/4,54,二叉树的遍历,二叉树的遍历的定义:按某种规律,访问二叉树的结点,使每个结点被访问一次且仅一次。访问的含义包括查询、打印、计算、修改等对结点的操
24、作。遍历的过程,实际上是按某种规律,将一个非线性结构的结点排成一个线性序列,使每个结点在这种遍历中有唯一前驱和后继关系。一棵二叉树的遍历序列(在某种遍历方式下)是唯一的,但一般说,二叉树不能由某一遍历序列唯一确定。,2023/9/4,55,二叉树的遍历,前序遍历二叉树中序遍历二叉树后序遍历二叉树,若二叉树为空,则空操作,否则:,层次遍历二叉树,2023/9/4,56,D L R,D L R,D L R,D L R,前序遍历序列:A B D C,前序遍历,2023/9/4,57,L D R,L D R,L D R,L D R,中序遍历序列:B D A C,中序遍历,2023/9/4,58,L R
25、 D,L R D,L R D,L R D,后序遍历序列:D B C A,后序遍历,2023/9/4,59,层次遍历序列:A B C D,层次遍历,2023/9/4,60,遍历图例,中序序列为:DBEACF,前序序列为:ABDECF,后序序列为:DEBFCA,2023/9/4,61,自测题,3.给定二叉树如下图所示。设N代表二叉树的根,L代表根结点的左子树,R代表根结点的右子树。若遍历后的结点序列为3,1,7,5,6,2,4,则其遍历方式是A.LRN B.NRL C.RLN D.RNL【2009年全国硕士研究生入学计算机学科专业基础综合试题】,2023/9/4,62,中序遍历二叉树的递归算法,t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 数据结构
链接地址:https://www.31ppt.com/p-5917646.html