数据结构树与二叉树.pptx
《数据结构树与二叉树.pptx》由会员分享,可在线阅读,更多相关《数据结构树与二叉树.pptx(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、15.1 树的基本概念树的基本概念1.树的定义2.若干术语3.逻辑结构4.存储结构5.树的运算第1页/共66页21.1.树的定义树的定义树的定义树的定义注1:树的定义具有递归性,即“树中还有树”。由一个或多个(n0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n1时,其余的结点分为m(m0)个互不相交的有限集合T1,T2,Tm。每个集合本身又是棵树,被称作这个根的子树。第2页/共66页3树的表示法主要有5种:v图形表示法v嵌套集合表示法v广义表表示法v凹入表示法v左孩子右兄弟表示法第3页/共66页4图形表示法:图形表示法:教师学生其他人员2002级2003级2004级2005级
2、华科大武昌分校电信系计算机系自控系叶子根子树第4页/共66页5嵌套集合表示法嵌套集合表示法第5页/共66页6广义表表示法广义表表示法(A(B(E(K,L),F),C(G),D(H(M),I,J)根作为由子树森林组成的表的名字写在表的左边datalink 1 link 2.link n麻烦问题:应当开设多少个链域?第6页/共66页7凹入表示法凹入表示法(又称目录表示法又称目录表示法)第7页/共66页8左孩子右兄弟表示法A AB BC CD DE EF FGGH HI IJ JK KL LMM数据左孩子 右兄弟第8页/共66页92.若干术语若干术语即树的数据元素结点挂接的子树数结点结点的度结点的层
3、次终端结点分支结点树的度树的深度(或高度)从根到该结点的层数(根结点算第一层)即度为0的结点,即叶子即度不为0的结点(也称为非终端结点)所有结点度中的最大值(Max各结点的度)指所有结点中最大的层数(Max各结点的层次)问:右上图中的结点数 ;树的度 ;树的深度1334(有几个直接后继就是几度,亦称“次数”)ABCGEIDHFJFLK第9页/共66页103.3.树的逻辑结构树的逻辑结构树的逻辑结构树的逻辑结构 一对多(1:n1:n),有多个直接后继(如家谱有多个直接后继(如家谱树、目录树等等),但只有一个根结点,树、目录树等等),但只有一个根结点,且且子树之间互不相交子树之间互不相交。4.4.
4、树的存储结构树的存储结构 讨论1:树是非线性结构,该怎样存储?特点:仍然有顺序存储、链式存储等方式。第10页/共66页115.2 5.2 二叉树二叉树为何要重点研究每结点最多只有两个为何要重点研究每结点最多只有两个 “叉叉”的树?的树?二叉树的结构最简单,规律性最强;二叉树的结构最简单,规律性最强;可以证明,所有树都能转为唯一对应的二叉树,不失一般性。可以证明,所有树都能转为唯一对应的二叉树,不失一般性。1.二叉树的定义2.二叉树的性质3.二叉树的存储结构(二叉树的运算见5.3节)第11页/共66页121.1.1.1.二叉树的定义二叉树的定义二叉树的定义二叉树的定义定义:是n(n0)个结点的有
5、限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。逻辑结构:一对二(1:2)基本特征:每个结点最多只有两棵子树(不存在度大于2的结点);左子树和右子树次序不能颠倒。问:具有问:具有3 3个结点的二叉树可能有几种不同形态?个结点的二叉树可能有几种不同形态?有有5 5种种基本形态:一般的树有几种?第12页/共66页132.2.2.2.二叉树的性质二叉树的性质二叉树的性质二叉树的性质 (3+2)(3+2)(3+2)(3+2)讨论1:第i层的结点数最多是多少?(利用二进制性质可轻松求出)性质1:在二叉树的第在二叉树的第i i层上至多有层上至多有2 2i-1i-1个结点(个结点
6、(i0i0)。)。性质2:深度为深度为k k的二叉树至多有的二叉树至多有2 2k k-1-1个结点(个结点(k0k0)。)。再提问:第i层上至少有 个结点?1讨论2:深度为k的二叉树,最多有多少个结点?(利用二进制性质可轻松求出)2 2i-1i-1个个2 2k k-1-1个个第13页/共66页14讨论讨论3 3:二叉树的叶子数和度为:二叉树的叶子数和度为2 2的结点数之间有关系吗?的结点数之间有关系吗?性质3:对于任何一棵二叉树,若2度的结点数有n2个,则叶子数(n0)必定为n21(即n0=n2+1)证明:证明:二叉树中全部结点数nn0+n1+n2(叶子数1度结点数2度结点数)又又二叉树中全部
7、结点数nB+1(总分支数根结点)(除根结点外,每个结点必有一个直接前趋,即一个分支)而而 总分支数B=n1+2n2 (1度结点必有1个直接后继,2度结点必有2个)三式联立可得:三式联立可得:n0+n1+n2=n1+2n2+1,即n0=n2+1物理意义:叶子数物理意义:叶子数2 2度结点数度结点数1 1第14页/共66页152.深度为的二叉树的结点总数,最多为 个。)k-1 )log2k )k )k1.树中各结点的度的最大值称为树的 。)高度 )层次 )深度 )度DCC3.深度为9的二叉树中至少有 个结点。)9 )8 )91课堂练习:第15页/共66页16满二叉树:满二叉树:一棵深度为一棵深度为
8、k 且有且有2k-1个结点的二叉个结点的二叉树。树。(特点:每层都(特点:每层都“充满充满”了结点)了结点)完全二叉树:深度为k 的、有n个结点的二叉树,当且仅当其每一个结点都与深度为k 的满二叉树中编号从1至n的结点一一对应。AOBCGEKDJFIHNML深度为4的满二叉树完全二叉树ABCGEIDHFJ为何要研究这两种特殊形式?完全二叉树的特点是只有最后一层叶子不满,且全部集中在左边。但这其实是顺序二叉树的含义。而图论中的“完全二叉树”是指n1=0的情况。因为它们在顺序存储方式下可以复原!第16页/共66页17对于两种特殊形式的二叉树(对于两种特殊形式的二叉树(满二叉树和完全二叉满二叉树和完
9、全二叉树树),还特别具备以下还特别具备以下2 2个性质:个性质:性质性质4:4:具有具有n n个结点的完全二叉树的深度必为个结点的完全二叉树的深度必为 loglog2 2n n 1 1性质性质5:5:对完全二叉树,若从上至下、从左至右编号,则对完全二叉树,若从上至下、从左至右编号,则编号为编号为i i 的结点的结点,其左孩子编号必为,其左孩子编号必为2i2i,其右孩子编号为,其右孩子编号为2i2i1 1;其双亲的编号必为;其双亲的编号必为i/2i/2(i i1 1 时为根时为根,除外)。除外)。证明:根据性质2,深度为k的二叉树最多只有2k-1个结点,且完全二叉树的定义是与同深度的满二叉树前面
10、编号相同,即它的总结点数n位于k层和k-1层满二叉树容量之间,即2k-1-1n2k-1 或2k-1n2k三边同时取对数,于是有:k-1log2n1)f=n*fact(n-1);else f=1;return(f);用递归形式格外简单!回忆1:二叉树结点的数据类型定义:则三种遍历算法可写出:第26页/共66页27中根遍历算法中根遍历算法LDR(node*root)if(root!=NULL)LDR(root-lchild);printf(“%d”,root-data);LDR(root-rchild);return(0);后根遍历算法后根遍历算法LRD(node*root)if(root!=NU
11、LL)LRD(root-lchild);LRD(root-rchild);printf(“%d”,root-data);return(0);结点数据类型自定义结点数据类型自定义typedef struct nodeint data;struct node*lchild,*rchild;node;node*root;先根遍历算法先根遍历算法DLR(node*root)if(root!=NULL)/非空二叉树 printf(“%d”,root-data);/访问DDLR(root-lchild);/递归遍历左子树DLR(root-rchild);/递归遍历右子树 return(0);第27页/共6
12、6页28对遍历的分析:1.从前面的三种遍历算法可以知道:如果将print语句抹去,从递归的角度看,这三种算法是完全相同的,或者说这三种遍历算法的访问路径是相同的,只是访问结点的时机不同。从虚线的出发点到终点的路径上,每个结点经过3次。AFEDCBG第1次经过时访问,是先根遍历第2次经过时访问,是中根遍历第3次经过时访问,是后根遍历2.二叉树遍历的时间效率和空间效率时间效率:O(n)O(n)/每个结点只访问一次空间效率:O(n)O(n)/栈占用的最大辅助空间精确值:树深为k的递归遍历需要k+1个辅助单元第28页/共66页29用空格字符表示无孩子或指针为空注:要实现遍历运算,必须先把二叉树存入电脑
13、要实现遍历运算,必须先把二叉树存入电脑内内怎样建树?例:将下面的二叉树以二叉链表形式存入计算机内。A AB BGGD DF FC CE E考虑1:输入结点时怎样表示“无孩子”?考虑2:以何种遍历方式来输入和建树?将二叉树按先序遍历次序输入:A B C D E G F 以先序遍历最为合适,让每个结点都能及时被连接到位。第29页/共66页30建树算法:Status CreateBiTree(BiTree&T)/构造二叉树Tscanf(“%c”,&ch);if(ch=)T=NULL;else if(!(T=(BiTNode*)malloc(sizeof(BiTNode)exit(overflow);
14、T-data=ch;/生成根结点 CreateBiTree(T-lchild);/构造左子树 CreateBiTree(T-rchild);/构造右子树 return OK;/CreateBiTree输入序列:A B C D E G F 第30页/共66页31问:用二叉链表法(l_child,r_child)存储包含n个结点的二叉树,结点的指针区域中会有多少个空指针?思考:二叉链表空间效率这么低,能否利用这些空闲区存放有用的信息或线索?我们可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度。所以,空指针数目2n(n-1)=n+1个。n+1n+1个个分析:用二叉链表存储包含n个结点的二
15、叉树,结点必有2n个链域(见二叉链表数据类型说明)。除根结点外,二叉树中每一个结点有且仅有一个双亲(直接前驱),所以只会有n1个结点的链域存放指针,指向非空子女结点(即直接后继)。线索二叉树线索二叉树第31页/共66页32思考:二叉链表空间效率这么低,能否利用这些空闲区存放有用的信息或线索?我们可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度。用二叉链表法存储包含n个结点的二叉树,结点的指针区域中会有n+1个空指针。这就是线索二叉树(Threaded Binary Tree)第32页/共66页335.4 线索二叉树线索二叉树(Threaded Binary Tree)二叉树中容易找
16、到结点的左右孩子信息,但该结点的直接前驱和直接后继只能在某种遍历过程中动态获得。先依遍历规则把每个结点对应的前驱和后继线索预存起来,这叫做“线索化”。意义:从任一结点出发都能快速找到其前驱和后继,且不必借助堆栈。对二叉树进行某种遍历之后,将得到一个线性有序的序列。例如对某二叉树的中序遍历结果是B D C E A F H G,意味着已将该树转为线性排列,显然其中结点具有唯一前驱和唯一后继。在此前提下,那n+1个空链域才可能装得下“线索”。讨论1:二叉树是1:2的非线性结构,其直接后继可能不止一个,如何存放?讨论2.如何获得这种“直接前驱”或“直接后继”?有何意义?第33页/共66页34 每个结点
17、增加两个域:fwd和bwd;存放前驱指针存放后继指针如何预存这类信息?有两种解决方法:与原有的左右孩子指针域“复用”,充分利用那n+1个空链域。规 定:1)若结点有左子树,则lchild指向其左孩子;否则,lchild指向其直接前驱(即线索);2)若结点有右子树,则rchild指向其右孩子;否则,rchild指向其直接后继(即线索)。datalchildrchildfwdbwddatalchildrchild缺点:空间效率太低!问题:计算机如何判断是孩子指针还是线索指针?如何区别?第34页/共66页35lchildLTagdataRTag rchild约定:当Tag域为0时,表示正常情况;当T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉
限制150内