当前位置: 首页 > news >正文

公司网站建设的通知购物平台官网

公司网站建设的通知,购物平台官网,wordpress设置邮件注册,网站商城建设合同二叉树-堆的实现 一、树的概念#xff08;什么是树#xff09;二、二叉树的概念及结构2.1 二叉树的概念2.2 二叉树的性质2.3 二叉树存储结构 三、二叉树的顺序结构3.1 堆的概念及结构3.2 堆的向下调整算法3.3堆的创建 四、堆的代码实现4.1 堆的初始化4.2 堆的销毁4.3 堆的插入… 二叉树-堆的实现 一、树的概念什么是树二、二叉树的概念及结构2.1 二叉树的概念2.2 二叉树的性质2.3 二叉树存储结构 三、二叉树的顺序结构3.1 堆的概念及结构3.2 堆的向下调整算法3.3堆的创建 四、堆的代码实现4.1 堆的初始化4.2 堆的销毁4.3 堆的插入4.4 堆的删除4.5 堆的判空及取堆顶数据4.6 测试 千里之行始于足下老铁们看到这篇文章一定要认真耐心地看下去哟 正文开始 一、树的概念什么是树 树是一种非线性的数据结构它是由nn0个有限结点组成一个具有层次关系的集合。那么为什么把它叫作树呢是因为它倒挂着就是树的形状根朝上叶朝下。 树有一个特殊节点就是根节点也就是最顶上的没有前驱节点的那个节点除根结点外其余结点被分成M(M0)个互不相交的集合T1、T2、……、Tm其中每一个集合Ti(1 i m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱节点可以有0个或多个后继节点因此树是递归定义的 ps:树的子树之间是不能有交集的有交集的就不能称之为树。如下图 树的基本术语节点的度 一个节点含有的子树数量叶节点 度为0的节点即没有子节点的节点根节点 没有父节点的节点父结点若一个结点含有子结点则这个结点称为其子结点的父结点子结点一个结点含有的子树的根结点称为该结点的子结点兄弟结点具有相同父结点的结点互称为兄弟结点层 根节点定义为第1层其子节点为第2层以此类推高度 从指定节点到叶节点的最长路径的长度森林 由多棵两棵及以上树组成的集合。 二、二叉树的概念及结构 2.1 二叉树的概念 一棵二叉树是节点的一个有限集合该集合 或者为空或者由一个根结点加上两棵别称为左子树和右子树的二叉树组成 2.2 二叉树的性质 性质1二叉树的第i层上至多有2i-1i≥1个节点     性质2深度为h的二叉树中至多含有2h-1个节点     性质3若在任意一棵二叉树中有n0个叶子节点有n2个度为2的节点则必有n0n21     性质4具有n个节点的满二叉树深为log2(n1)     5. 对于具有n个结点的完全二叉树如果按照从上至下从左至右的数组顺序对所有结点从0开始编号则对于序号为i的结点有 若i0i位置结点的双亲序号(i-1)/2i0i为根结点编号无双亲结点若2i1n左孩子序号2i12i1n否则无左孩子若2i2n右孩子序号2i22i2n否则无右孩子 2.3 二叉树存储结构 二叉树又可以分为顺序存储和链式存储两种 1.顺序存储     顺序存储就是使用数组结构来存储而顺序存储一般只表示完全二叉树否则会造成空间浪费的现象。二叉树顺序存储在物理上是一个数组在逻辑上是一颗二叉树。 2.链式存储     二叉树的链式存储结构是指用链表来表示一棵二叉树即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成数据域和左右指针域左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 typedef int BTDataType; // 二叉链 struct BinaryTreeNode {struct BinTreeNode* left; // 指向当前结点左孩子struct BinTreeNode* right; // 指向当前结点右孩子BTDataType data; // 当前结点值域 }三、二叉树的顺序结构 3.1 堆的概念及结构 若有一个集合{k0,k1,k2…k(n-1)}将它所有的元素以完全二叉树的顺序存储形式于一个一维数组中并满足{k(i)k(2i1)且k(i)k(2i2)};或{k(i)k(2i1)且k(i)k(2i2)}则称为小堆或大堆。 堆的性质 堆中某个结点的值总是不大于或不小于其父结点的值堆总是一棵完全二叉树 3.2 堆的向下调整算法 给出如下一个数组逻辑上看做一颗完全二叉树。我们通过从根结点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提左右子树必须是一个堆才能调整。 int arr[]{27,15,19,18,28,34,65,49,25,37};3.3堆的创建 下面我们给出一个数组这个数组逻辑上可以看做一颗完全二叉树但是还不是一个堆现在我们通过算法把它构建成一个堆。根结点左右子树不是堆我们怎么调整呢这里我们从倒数的第一个非叶子结点的子树开始调整一直调整到根结点的树就可以调整成堆。 int a[ ] {1,5,3,8,7,6}; 四、堆的代码实现 堆的底层逻辑动态数组 #include stdio.h #include assert.h #include stdbool.h #include stdlib.h// 类型定义 typedef int HPDataTpye;typedef struct Heap {HPDataTpye* arr;int size;// 元素个数int capacity;// 空间容量 }Heap; //初始化 void HPInit(HP* php); //交换头尾 void Swap(HPDataType* p1, HPDataType* p2); //数据向下调整 void AdjustUp(HPDataType* a, int child); //数据向下调整 void AdjustDown(HPDataType* a, int n, int parent); //销毁堆 void HPDestroy(HP* php); //向堆添加数据 void HPPush(HP* php, HPDataType x); //删除数据 void HPPop(HP* php); //找堆顶数据 HPDataType HPTop(HP* php); //判空 bool HPEmpty(HP* php);4.1 堆的初始化 堆的初始化方式是跟顺序表的初始化是一样的因为堆使用的是顺序存储 void HPInit(HP* php) {assert(php);php-arrNULL;php-sizephp-capacity0; }4.2 堆的销毁 void HPDestroy(HP* php) {assert(php);free(php-a);php-a NULL;php-size php-capacity 0; }4.3 堆的插入 堆的插入方式也跟顺序表的差不多就是将新的节点插入数组的尾部但是光插入还不行还要继续调整节点的位置因为插入节点后有可能使原本的堆变为数组而不是堆了 具体的代码实现 //数据向上调整 void AdjustUp(HPDataType* a, int child) {int parent (child - 1) / 2;//利用数组下标找到parent的位置while (child 0)//while(parent0)属于歪打正着{if (a[child] a[parent]){Swap(a[child], a[parent]);child parent;parent (child - 1) / 2;}else{break;}} } //插入数据 void HPPush(HP* php, HPDataType x) {assert(php);if (php-size php-capacity){int newcapacity php-capacity 0 ? 4 : php-capacity * 2;HPDataType* tmp (HPDataType*)realloc(php-a, newcapacity * sizeof(HPDataType));if (tmp NULL){perror(realloc fail);return;}php-a tmp;php-capacity newcapacity;}php-a[php-size] x;php-size;AdjustUp(php-a, php-size - 1);//将数据插入后进行向上调整 }4.4 堆的删除 堆的删除删的是堆顶的数据而删除堆顶的数据就没有想象中的这么简单了。删除堆顶的数据不能直接将其释放掉若直接释放根就没有了只剩下左右两个堆又要将堆重新建好代价太大这时我们应该将堆尾和堆顶数据换位置再将堆尾的数据释放掉然后将堆顶的数据向下调整直到重新成堆 代码实现 //数据向下调整 void AdjustDown(HPDataType* a, int n, int parent) {// 先假设左孩子小int child parent * 2 1;while (child n) // child n说明孩子不存在调整到叶子了{// 找出小的那个孩子if (child 1 n a[child 1] a[child]){child;}if (a[child] a[parent]){Swap(a[child], a[parent]);parent child;child parent * 2 1;}else{break;}} } //删除堆顶 void HPPop(HP* php) {assert(php);assert(php-size 0);Swap(php-arr[0], php-arr[php-size - 1]);php-size--;AdjustDown(php-arr, php-size, 0); }4.5 堆的判空及取堆顶数据 //找堆顶数据 HPDataType HPTop(HP* php) {assert(php);assert(php-size 0);return php-arr[0];//直接将数组第一个数据返回即可 } //判空 bool HPEmpty(HP* php) {assert(php);return php-size 0;//当size等于0时就返回空 }4.6 测试 #includeHeap.h void TestHP01() {HP hp;HPInit(hp);int arr[] { 4,2,8,1,5,6,9,7,3,2 };for (size_t i 0; i sizeof(arr) / sizeof(int); i){HPPush(hp, arr[i]);}/*while (!HPEmpty(hp)){printf(%d , HPTop(hp));HPPop(hp);}*/HPDestroy(hp); } int main() {TestHP01();return 0; }调试结果形成小堆
http://www.dnsts.com.cn/news/107008.html

相关文章:

  • 威海网站建设威海曲阜住房城乡建设局网站
  • 网站开发语言有php事业部网站建设方案
  • 心理网站免费建设大理如何做百度的网站
  • 网站推广软件免费观看福田网站建设新闻
  • 网站关键词seo优化公司陕西省住房与建设厅网站
  • 做电影网站 资源怎么存放自己做的网站图片挡住了导航栏
  • 浙江网站怎么做推广chn域名注册网站
  • 丰金网络 做网站网站开发职业类别代码
  • 网站管理教程关键词挖掘查询工具
  • 网站设计命名规范网站开发 访问速度慢
  • 建手机网站要多少钱网站美工色彩搭配
  • 网站对于企业的意义比较好看的wordpress主题
  • 网站制作公司品牌和商标的区别
  • 网站建设需要多少工种wordpress 数据库 缓存6
  • 中山市建设安全监督站网站seo博客
  • 免费制作微信小程序的网站上海企业网页制作
  • 大型企业网站开发如何增加网站流量
  • 网站分页设计网页制作的模板代码
  • 网站建设zvge怎么免费建设个人博客网站
  • 公司网站服务器选择合优人才网合川
  • 免费发软文的网站我国中小企业500强
  • wordpress手机网站模版个人求职网站如何做
  • 做米业的企业网站中国能源建设集团有限公司总部
  • 自己做的网站服务器开了进不去开发工具是什么意思
  • 大气精美网站设计工作室织梦模板wordpress 内网映射
  • 牙科 网站建设方案凯里网络公司建设网站
  • 起飞页做网站步骤wordpress 4.0 慢
  • 网站开发有哪些服务器网站建设公司 关于我们
  • 济南推广网站建设电商网站 cms
  • 怎么制作平台网站找别人做网站需要注意什么