版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
树第66.1树的定6.2树的遍6.3树第66.1树的定6.2树的遍6.3树的表示6.4二叉树的基本概6.5ADT二叉6.6线索二叉6.7树的应福州大学数学与计算机科学学院1学习要点学习要点理解树的定义和与树相关的结点、度、路径等术语。理解树是一个非线性层次数据结构。掌握树的前序遍历、中序遍历和后序遍历方法。了解树的父结点数组表示法。了解树的儿子链表表示法。了解树的左儿子右兄弟表示法。理解二叉树的概念。了解二叉树的顺序存储结构。了解二叉树的结点度表示法。掌握用指针实现二叉树的方法。理解线索二叉树结构及其适用范围。福州大学数学与计算机科学学院26.1树的定义定递归定义6.1树的定义定递归定义单个结点是一棵树,该结点就是树根。设T1,T2,…,Tk都是树,它们的根结点分别为n1,n2…nkn是另一个结点且以n1,n2…nk为儿子,则T1,T2,…,Tk和n构成一棵新树。结点n就是新树的根。称n1,n2…nk为一组兄弟结点。还称T1,T2,…,Tk为结点n的子树。为了方便起见,空集合也看作是树,称为空树,并用来表示。空树中没有结点。福州大学数学与计算机科学学院3只有根结点的树A有子树的根ABCDEFGHIJK只有根结点的树A有子树的根ABCDEFGHIJKLM子福州大学数学与计算机科学学院4基本术结点——表示树中的包括据项及若基本术结点——表示树中的包括据项及若干向其子树的分支结点的度——结点的儿子点个数树的度——一棵树中最大的结点度数叶结点——度为0的结点分枝结点——度不为0的结路径——若存在树中一个节点k1k2…kj得结点ki是ki+1的父结点(1i<j)则称该结序列是树从结点k1结点kj的一条路径。路径长度——路径所经过的边的数目祖先、子孙——任一结点既是它自己的祖先也是它自己的子孙。结点的高度——从该结点到各叶结的最长路径长度树的高度——根结点的高度结点的深度(或层数)——从树根到任一结点n有唯一的路径,称该路径的长度为结点n的深度(或层数)。从根结点算起,根为第0层,它的孩子为第1层有序树——为树的每一组弟结点定义一个从到右的次序左儿子、右兄弟森林——m(m0)棵互不相交的树的集合福州大学数学与计算机科学学院5叶结点分枝节点结点A的度结点B的度结点M的度A结点I的父亲结点结点L的父亲结点树的B叶结点分枝节点结点A的度结点B的度结点M的度A结点I的父亲结点结点L的父亲结点树的BCD结点BCD为结点KL为EFGHIJKLM结点A的高度结点D树的高度结点A的儿子结点结点B的儿子节点结点A是结点F…的:结点A的层次结点M的层结点BC…是结点A的:福州大学数学与计算机科学学院6返回章目6.2树的遍历树的遍遍历——按一定规律走遍树的各个顶点,且使6.2树的遍历树的遍遍历——按一定规律走遍树的各个顶点,且使每一顶点仅被访问一次,即找一个完整而有规律的走法,以得到树中所有结点的一个线性排列。树T的3种遍历方式的递归定义:(T如图所示前序遍历——先访问树根n,然后依次前序遍历T1,T2,…,Tk。中序遍历——先中序遍历T1,然后访问树根n,接着依次对T2,T3,…,Tk进行中序遍历(3)后序遍历——先依次对T1,T2,…,Tk进行后序遍历最后访问树根n树福州大学数学与计算机科学学院7ABCDGEFHJKLMINO前序遍历:ABEABCDGEFHJKLMINO前序遍历:ABEFIGCDHJKLNOM中序遍历EBIFGACJHKNLOMD后序遍历EIFGBCJKNOLMHD层次遍历:ABCDEFGHIJKLMN福州大学数学与计算机科学学院8有序树T的3种遍历的非递归方式按第一次经过的时间次序将各个有序树T的3种遍历的非递归方式按第一次经过的时间次序将各个结点列表:ABEFIJCDGH按最后一次经过的时间次序将各个结点列表:EIJFBCGHDA前序列后序列叶结点在第一次经过时列出,而内部结点在第2次经过时列出EBIFJACGD中序列福州大学数学与计算机科学学院9有序树T的3种遍历能得到什么信息?(1)在3种不同方式中,各树叶之间的相对次序是相同的,它们都按树叶之间从左到右的次序排列,其差别仅在于内部结点之间以及内部结点与树叶之间的次序有所不同。(2有序树T的3种遍历能得到什么信息?(1)在3种不同方式中,各树叶之间的相对次序是相同的,它们都按树叶之间从左到右的次序排列,其差别仅在于内部结点之间以及内部结点与树叶之间的次序有所不同。(2)后序遍历有助于查询结点间的祖先和子孙关系,因为postorder(y)-desc(y)postorder(x)postorder(y)。其中y是T中的任一结点;x是y的子孙;desc(y)是T中y的真子孙数;postorder(y)是T中y的后序序号。(3)前序遍历也有助于查询结点间的祖先和子孙关系,因为preorder(y)preorder(x)preorder(y)+desc(y)。其中y是T中的任一结点x是y的子孙desc(y)是T中y真子孙数;preorder(y)是T中y的前序序号福州大学数学与计算机科学学院返回章目6.3树的表示法树的6.3树的表示法树的存储结构父结点数组表示法树中的结点数字化为它们的编号1,2,…,n用一个一维数组存储每个结点的父结点。即:father[k]中是存放结点k的父结点的编号。由于树中每个结点的父结点是唯一的,所以父结点数组表示法可以唯一表示任何一棵树。实例:见下福州大学数学与计算机科学学院如何找儿子和兄弟结点如何找儿子和兄弟结点福州大学数学与计算机科学学院效率分析寻找一个结点的效率分析寻找一个结点的父结点只需要O(1)时间于涉及查询儿子结点和兄弟结点信息的运能要遍历整个数组。福州大学数学与计算机科学学院孩子表示法0123456789abcfdeghi如何找父亲结点福州大学数学与计算机科学学院9^873^5^246^abcd^ef^孩子表示法0123456789abcfdeghi如何找父亲结点福州大学数学与计算机科学学院9^873^5^246^abcd^ef^g^h^i^带双亲的孩子链表123456789abcfdeghi福州大学数学与计算机科学学院9^875^4 a0b1c1d2^e2f3^g5^h5带双亲的孩子链表123456789abcfdeghi福州大学数学与计算机科学学院9^875^4 a0b1c1d2^e2f3^g5^h5^i5^3^2左儿子右兄弟表示法实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其最左儿子和右邻兄弟abcdefghi福州大学数学与计算机科学学院返回章目^i^^h^ge^^f^^dc^左儿子右兄弟表示法实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其最左儿子和右邻兄弟abcdefghi福州大学数学与计算机科学学院返回章目^i^^h^ge^^f^^dc^ba^二叉树的基本概念定义:二叉树是n(n0)个结点的有限集,它或为空树(n=0)二叉树的基本概念定义:二叉树是n(n0)个结点的有限集,它或为空树(n=0)或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。特点每个结点至多有二棵子树(即不存在度大于2的结点)二叉树的子树有左、右之分,且其次序不能任意颠倒基本形AAAABCBB左、右子树均非空只有根结点的二叉树空二叉左子树为右子树为福州大学数学与计算机科学学院具有n个结点的不同形态的二叉数的数目即所谓的n阶Catalan数:2n1Bn1具有n个结点的不同形态的二叉数的数目即所谓的n阶Catalan数:2n1Bn1nn因为一棵具有n个结点的二叉树可以看成是由一个根结点、一棵具有i个结点的左子树和一棵具有n-i-1个结点的右子树i=0,1,2,3,…,n-1Bn可以递归地表达为nn1BiBni解此递归式即是上述的显式表达式。福州大学数学与计算机科学学院例如:具有3例如:具有3个结点的不同形态的二叉数的数目B3=5福州大学数学与计算机科学学院二叉树性质高度为h≥0的二叉二叉树性质高度为h≥0的二叉树至少有h+1个结点。高度为h≥0的二叉树至多有2h+1-1个结点。约定空二叉树的高度为-1含有n≥1个结点的二叉树的高度至多为n-1含有n≥1个结点的二叉树的高度至少为logn,因此为Ω(logn)。福州大学数学与计算机科学学院重要性质:对任何一重要性质:对任何一棵二叉树T如果其终端结点数为n0,度为2的结点数为n2,证明:n1为二叉树T中度为1的结点因为:二叉树中所有结点的度均小于或等于2所以:其结点总数n=n0+n1+n2又二叉树中,除根结点外其余结点都只有一个分支进入设B为分支总数,则n=B+1又:分支由度为1和度为2的结点射于是,福州大学数学与计算机科学学院几种特殊形式的二叉树满二叉几种特殊形式的二叉树满二叉定义:一棵高度为h且有2h11个结点的二叉树称为满二叉树。特点:每一层上的结点数都是最大结点数近似满二叉树(完全二叉树定义:若一棵二叉树最多只有最下面的2层上结点的度数可以小于2,并且最下面一层上的节点都集中在该层的最左边,则这种二叉树称为近似满二叉树福州大学数学与计算机科学学院1123234567458967112323456745689福州大学数学与计算机科学学院1123234567458967112323456745689福州大学数学与计算机科学学院近似满二叉树性质:如果对一棵有n个结点的近似满二叉树性质:如果对一棵有n个结点的完全二叉树的结点按层序编号一结点i(1in)如果i=1,则结点i是二叉树的根,无双亲果i>1,则其双亲是如果2i>n,则结点i无左孩子;如果2in,则其左孩子是2i如果2i+1>n,则结点i无右孩子;如果则其右孩子是福州大学数学与计算机科学学院返回章目ADT二叉6.5.1ADT二叉树的运算ADT二叉树支持的主ADT二叉6.5.1ADT二叉树的运算ADT二叉树支持的主要基本运算::创建一棵空二叉树。:判断给定的二叉树是否为空。返回给定二叉树T的根结点标号。:(4)MakeTree(x,T,L,R):以x为根结点元素,以L、R分别为左、右子树,构建一棵新的二叉树T函数MakeTree的逆运算,即将二树T拆分为根结点元素,左子树L和右子树R等3部分福州大学数学与计算机科学学院6.5ADT二叉树6.5.1ADT二叉树的运算ADT二6.5ADT二叉树6.5.1ADT二叉树的运算ADT二叉树支持的主要基本运算(续)(6)PreOrder(visit,T)前序遍历给定的二叉树。(7)InOrder(visit,T)中序遍历给定的二叉树。(8)PostOrder(visit,T)后序遍历给定的二叉树。(9)PreOut(T)给定的二叉树的前序列表。(10)InOut(T)给定的二叉树的中序列表。给定的二叉树的后序列表。(12)Delete(T)删除给定的二叉树。求给定的二叉树的高度。求给定的二叉树的结点数。福州大学数学与计算机科学学院6.5ADT二叉树ADT二叉树的实用顺序存储结构实现(一种无边表示适用的对象:近6.5ADT二叉树ADT二叉树的实用顺序存储结构实现(一种无边表示适用的对象:近似满二叉树号。12345678911福州大学数学与计算机科学学院ABCDEFGHIJKL不适用的例子:abcdef1 45678910福州大学数学与计算机科学学院ab不适用的例子:abcdef1 45678910福州大学数学与计算机科学学院abcde0000f06.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的结点度表示法(另一种无边表示例福州大学数学与计算机科学学院6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—二叉树结点结构定义福州大学数学与计算机科学学院typedefstructbtnode*btlink;typedefstructbtnode{TreeItembtlinkleft; btlinkright; }Btnode6.5ADT二叉树ADT二叉树的实现二6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—ADT二叉树结构定福州大学数学与计算机科学学院typedefstructbinarytree*Binarytree;typedefstructbinarytree{btlink //6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—创建一棵空二叉树福州大学数学与计算机科学学院BinarytreeBinaryInit({BinaryTreeT=(BinaryTree)malloc(sizeof*T);return}6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—BinaryEmpty(T)、Root(T)实现福州大学数学与计算机科学学院intBinaryEmpty(BinaryTree{returnT-}TreeItemRoot(BinaryTree{if(BinaryEmpty(T))Error(“Treeisempty”);returnT->root->element;}6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—MakeTreexTLR的实福州大学数学与计算机科学学院voidMakeTree(TreeItemx,BinaryTreeBinaryTreeL,BinaryTree{/*以x为根结点元素,L和R分别为左右子树构建一棵新的二叉树}6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—BreakTree(T,L,R)的实福州大学数学与计算机科学学院TreeItemBreakTree(BinaryTreeBinaryTreeL,BinaryTree{/*将二叉树T拆分为根结点元素element,左子树L和右子树R三部分TreeItemif(!T->root)Error(“Treeisempty”);return}6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—前序遍历运算的递归实现福州大学数学与计算机科学学院voidPreOrder(void(*visit)(btlinku),btlink{if(t)(*visit)PreOrder(visit,t->left);PreOrder(visit,t->right);}}前序遍历过程AACBDBCBDC前序遍历序列:AD福州大学数学与计算机科前序遍历过程AACBDBCBDC前序遍历序列:AD福州大学数学与计算机科学学院 6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—前序遍历运算的非递归实福州大学数学与计算机科学学院voidPreOrder(void(*visit)(btlinku),btlink{Stacks=StackInit();Push(t,s);while(!StackEmpty{(*visit)(t=Popif(t->right)Push(t->right,s);if(t->left)Push(t->left,s);}}6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—中序遍历运算的递归实现福州大学数学与计算机科学学院voidInOrder(void(*visit)(btlinku),btlink{if(t)InOrder(visit,t->left);(*visit)(t);InOrder(visit,t-}}中序遍历过程AACBDBCDAC中序遍历序列:BD福州大学数学与计算机科中序遍历过程AACBDBCDAC中序遍历序列:BD福州大学数学与计算机科学学院 L 6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—后序遍历运算的递归实现福州大学数学与计算机科学学院voidPostOrder(void(*visit)(btlinku),btlink{if(t)PostOrder(visit,t->left);PostOrder(visit,t->right);(*visit)(t);}}后序遍历过程AACBBDC后序遍历序列:DBAD福州大学后序遍历过程AACBBDC后序遍历序列:DBAD福州大学数学与计算机科学学院 L 6.5ADT二叉树ADT二叉树的实现二叉6.5ADT二叉树ADT二叉树的实现二叉树的指针实现—层次遍历运算的实现福州大学数学与计算机科学学院voidLevelOrder(void(*visit)(btlinku),btlink{Queueq=QueueInit();EnterQueue(t,q);while(!QueueEmpty{(*visit)(t=DeleteQueueif(t->left)EnterQueue(t->left,if(t->right)EnterQueue(t->right,}ADT二叉树ADT二叉树的实现二叉树的指ADT二叉树ADT二叉树的实现二叉树的指针实现—求二叉树的结点福州大学数学与计算机科学学院返回章目intSize(btlink{intlsize,rsize;if(!t)return0;lsize=Size(t-returnlsize+rsize+1;}6.6线索二叉树引入线索二叉树的动因用指针6.6线索二叉树引入线索二叉树的动因用指针实现二叉树时,每个结点只有指向其左、右儿子结点的指针,所以从任一结点出发直接只能找到该结点的左、右儿子。在一般情况下无法直接找到该结点在某种遍历序下的前驱和后继结点。若在每个结点中增加指向其前驱和后继结点的指针,虽可提高遍历的效率却降低了存储效率。注意到用指针实现二叉树时,n个结点二叉树中有n+1个空指针。若利用这些空指针存放指向结点在某种遍历次序下的前驱或后继的指针,那么,可以期望提高遍历的效率。福州大学数学与计算机科学学院6.6线索二叉树有关概念和术语线索:所引入的6.6线索二叉树有关概念和术语线索:所引入的非空指针称为线索。线索二叉树:加上了线索的二叉树称为线索二叉树。线索标志位:为了区分一个结点的指针是指向其儿子结点的指针,还是指向其前驱或后继结点的线索,在每个结点中增加2个位leftThread、rightThread分别称为左、右线索标志位。线索化:对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为二叉树的线索化。福州大学数学与计算机科学学院6.6线索二叉树线索二叉树6.6线索二叉树线索二叉树结点类型定福州大学数学与计算机科学学院typedefstructbtnode*tbtlink;typedefstructtbtnode{TreeItembtlinkleft; /*左子树*/btlinkright; intleftThread, /*左线索标志*/ /*右线索标志}ThreadedNode6.6线索二叉树二叉树线索化由于6.6线索二叉树二叉树线索化由于线索化的实质是将二叉树中的空指针改为指向其前驱结点或后继结点的线索(并做上线索标志),而一个结点的前驱或后继结点只有遍历才能知道,因此线索化的过程是在对二叉树遍历的过程中修改空指针的过程。为了记下遍历过程中访问结点的先后次序,可引入指针p指引遍历,而引入指针pre跟踪p的前驱。首先将pre和p初始化为遍历的第一结点。然后让p往遍历的方向走找pre的后继。一旦找到,则它们互为前驱和后继,建立相应线索。接着将p赋给pre,重复下去直到遍历结束。福州大学数学与计算机科学学院6.6线索二叉树二叉树的中序线索化增加一个头结6.6线索二叉树二叉树的中序线索化增加一个头结点,其left指针指向二叉树的根结点,其right指针指向中序遍历的最后一个结点。另外二叉树中依中序列表的第一个结点的left指针和最后一个结点的right指针指向头结点。这样一来,就好象为二叉树建立了一个双向线索链表,既可从中序遍历的第一个结点起进行中序的遍历;也可从中序遍历的最后一个结点起进行逆中序的遍历。福州大学数学与计算机科学学院6.6线索二叉树线索二叉树与非线索二叉树比较优点对于6.6线索二叉树线索二叉树与非线索二叉树比较优点对于找前驱和后继结点2运算而线索二叉树优于非线索二叉树。缺点在进行结点插入和索二叉树的间开在线进行结点插和删相应要修改相应的线索。福州大学数学与计算机科学学院前序线索二叉树示例:TABDCE前序序列:前序线索二叉树福州大学数学与计算机科学学院1E1^1C10D11B00A0前序线索二叉树示例:TABDCE前序序列:前序线索二叉树福州大学数学与计算机科学学院1E1^1C10D11B00A0中序线索二叉树示例:TABDCE中序序中序线索二叉树福州大学数学与计算机科学学院1E11C10D1^中序线索二叉树示例:TABDCE中序序中序线索二叉树福州大学数学与计算机科学学院1E11C10D1^^1B00A0后序线索二叉树示例:TABDCE后序序列后序线索二叉树福州大学数学与计算机科学学院1E1^1C1后序线索二叉树示例:TABDCE后序序列后序线索二叉树福州大学数学与计算机科学学院1E1^1C10D11B00A0TABDTCE0A0中序序中序线索二叉树头结点leftThread=0,left指向根结点rightThread=1,right指向遍历序列中最后一个结点遍历序列中第一个结点的left域和最后一个结点的right域TABDTCE0A0中序序中序线索二叉树头结点leftThread=0,left指向根结点rightThread=1,right指向遍历序列中最后一个结点遍历序列中第一个结点的left域和最后一个结点的right域都指向头结点中序序带头结点的中序线索二叉树福州大学数学与计算机科学学院1E11C10D11B01E11
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 借款给别人建房协议书
- 2025-2030人工智能芯片行业市场现状供需分析及智能投资评估规划分析研究报告
- 2025-2030人工智能芯片技术研发进展与市场供需分析研究
- 2025-2030人工智能艺术创作市场分析及投资发展报告
- 2025-2030人工智能算法改进计算能力优化行业标准研究分析政策建议报告
- 2025-2030人工智能教育行业应用场景教学质量技术突破竞争力评估规划
- 2025-2030人工智能应用领域行业解决方案开发场景融合技术落地规划发展咨询报告
- 2025-2030人工智能应用场景商业化落地路径行业最佳解决方案报告
- 2025-2030人工智能在安防领域的应用行业市场现状与发展规划分析研究
- 2025-2030人工智能医疗行业市场趋势分析投资评估未来规划发展报告
- 采购石粉合同协议
- 驾考试题100道及答案
- 麻醉科工作总结
- 弹塑性力学完整版本
- 小学生预防寄生虫
- 洛必 达法则课件
- 【MOOC】《高级语言程序设计》(南京邮电大学)章节中国大学慕课答案
- 吉林大学《模拟电子电路》2021-2022学年期末试卷
- 2024秋国开《社会调查研究与方法》形成性考核2参考答案(第2套)
- 企业信息咨询服务合同
- 斜墙模板施工计算书
评论
0/150
提交评论