2026/3/28 10:18:37
网站建设
项目流程
杭州网站改版公司,wordpress调取指定分类下的文章,网站建设进度表 免费下载,wordpress 空间安装一.树概念及结构1.1 树的概念树是一种非线性的数据结构#xff0c;它是由n#xff08;n0#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树#xff0c;也就是说它是根朝上#xff0c;而叶朝下的。有一个特殊的结点#xff0…一.树概念及结构1.1 树的概念树是一种非线性的数据结构它是由nn0个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树也就是说它是根朝上而叶朝下的。有一个特殊的结点称为根结点根节点没有前驱结点除根节点外其余结点被分成M(M0)个互不相交的集合T1、T2、……、Tm其中每一个集合Ti(1 i m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱可以有0个或多个后继因此树是递归定义的。前驱的意思就是该节点是否有上级节点后继的意思就是该节点下面是否有节点注意树形结构中子树之间不能有交集否则就不是树形结构1.2 树的相关概念节点的度一个节点含有的子树的个数称为该节点的度如上图A的为6叶节点或终端节点度为0的节点称为叶节点如上图B、C、H、I...等节点为叶节点非终端节点或分支节点度不为0的节点如上图D、E、F、G...等节点为分支节点双亲节点或父节点若一个节点含有子节点则这个节点称为其子节点的父节点如上图A是B的父节点孩子节点或子节点一个节点含有的子树的根节点称为该节点的子节点如上图B是A的孩子节点兄弟节点具有相同父节点的节点互称为兄弟节点如上图B、C是兄弟节点树的度一棵树中最大的节点的度称为树的度如上图树的度为6节点的层次从根开始定义起根为第1层根的子节点为第2层以此类推树的高度或深度树中节点的最大层次如上图树的高度为4节点的祖先从根到该节点所经分支上的所有节点如上图A是所有节点的祖先子孙以某节点为根的子树中任一节点都称为该节点的子孙。如上图所有节点都是A的子孙森林由mm0棵互不相交的树的集合称为森林重点记忆的叶节点、父节点、子节点、树的读和树的高度1.3 树的表示树结构相对线性表就比较复杂了要存储表示起来就比较麻烦了既然保存值域也要保存结点和结点之间的关系实际中树有很多种表示方式如双亲表示法孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法。typedef int DataType; struct Node { Node* _firstChild; // 第一个孩子节点 Node* _pNextBrother; // 下一个兄弟节点 DataType _data; // 数据域 };而这个在实际中的应用文件系统的结构二.二叉树概念及结构2.1 二叉树的概念一棵二叉树是结点的一个有限集合该集合1. 为空或者只有一个根节点2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成从上图可以看出1. 二叉树不存在度大于2的结点即一个节点最多只有两个分支2. 二叉树的子树有左右之分次序不能颠倒因此二叉树是有序树注意对于任意的二叉树都是由以下几种情况复合而成的2.2 特殊的二叉树1.满二叉树一个二叉树如果每一个层的结点数都达到最大值则这个二叉树就是满二叉树。也就是说如果一个二叉树的层数为K且结点总数是2ᵏ-1则它就是满二叉树。2.完全二叉树完全二叉树是效率很高的数据结构完全二叉树是由满二叉树而引出来的。对于深度为K的有n个结点的二叉树当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。2.3 二叉树的性质1.若i0i位置节点的双亲序号(i-1)/2i0i为根节点编号无双亲节点2.若2i1n左孩子序号2i12i1n否则无左孩子3.若2i2n右孩子序号2i22i2n否则无右孩子1. 某二叉树共有 399 个结点其中有 199 个度为 2 的结点则该二叉树中的叶子结点数为 A 不存在这样的二叉树 B 200 C 198 D 199 2.下列数据结构中不适合采用顺序存储结构的是 A 非完全二叉树 B 堆 C 队列 D 栈 3.在具有 2n 个结点的完全二叉树中叶子结点个数为 A n B n1 C n-1 D n/2 4.一棵完全二叉树的节点数位为531个那么这棵树的高度为 A 11 B 10 C 8 D 12 5.一个具有767个节点的完全二叉树其叶子节点个数为 A 383 B 384 C 385 D 386 答案 1.B 2.A 3.A 4.B 5.B这些答案都是上面二叉树的性质就不和大家讲解了2.4 二叉树的存储结构二叉树一般可以使用两种结构存储一种顺序结构一种链式结构。1.顺序存储顺序结构存储就是使用数组来存储一般使用数组只适合表示完全二叉树因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组在逻辑上是一颗二叉树。2.链式存储二叉树的链式存储结构是指用链表来表示一棵二叉树即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成数据域和左右指针域左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链当前我们学习中一般都是二叉链后面课程学到高阶数据结构如红黑树等会用到三叉链。typedef int BinaryTreeNode; struct BinaryTreeNode { BinaryTreeNode* _pLeft; // 指向当前节点左孩子 BinaryTreeNode* _pRight; // 指向当前节点右孩子 BTDataType _data; // 当前节点值域 }; struct BinaryTreeNodeWithParent { BinaryTreeNodeWithParent* _pParent; // 指向当前节点的双亲 BinaryTreeNodeWithParent* _pLeft; // 指向当前节点左孩子 BinaryTreeNodeWithParent* _pRight; // 指向当前节点右孩子 BTDataType _data; // 当前节点值域 };三.二叉树的顺序结构及实现3.1二叉树的顺序结构普通的二叉树是不适合用数组来存储的因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事一个是数据结构一个是操作系统中管理内存的一块区域分段。3.2堆的概念及结构堆的性质堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树一些相关堆的选择题1.下列关键字序列为堆的是 A 100,60,70,50,32,65 B 60,70,65,50,32,100 C 65,100,70,32,50,60 D 70,65,100,32,50,60 E 32,50,100,70,65,60 F 50,100,70,65,60,32 2.已知小根堆为8,15,10,21,34,16,12删除关键字 8 之后需重建堆在此过程中 关键字之间的比较次数是。 A 1 B 2 C 3 D 4 3.一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为 A(11 5 7 2 3 17) B(11 5 7 2 17 3) C(17 11 7 2 3 5) D(17 11 7 5 3 2) E(17 7 11 3 5 2) F(17 7 11 3 2 5) 4.最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后其结果是 A[3257468] B[2357468] C[2345786] D[2345678]或许大家不会做没关系因为我还没有讲堆的具体实现如果不会做可以留到我下一章当然如果大家会做也可以先做我在下一章会给出详解和答案。关于本章内容重点是了解树的概念至于树的表示我们只需要了解一下毕竟我们后面的重心是关于二叉树的性质关于树的理论知识是不难的难点在于与树常见搭配的递归