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

电子商务网站建设与管理教材wordpress 产品缩略图

电子商务网站建设与管理教材,wordpress 产品缩略图,广告设计与制作主修课程有哪些,备案 网站下线目录 前言 一、树的概念及结构 1 树的概念 2 树的相关概念 二、二叉树的概念及结构 1.二叉树的概念 2. 特殊的二叉树 3. 二叉树的性质 4.二叉树的存储结构 三、二叉树的顺序结构及实现 1.堆的性质 2.堆的插入 3.堆的实现 堆的结构体 HeapInit 初始化 HeapPush 插入 HeapPop 删… 目录 前言 一、树的概念及结构 1 树的概念 2 树的相关概念  二、二叉树的概念及结构 1.二叉树的概念 2. 特殊的二叉树 3. 二叉树的性质 4.二叉树的存储结构  三、二叉树的顺序结构及实现  1.堆的性质 2.堆的插入 3.堆的实现 堆的结构体 HeapInit 初始化 HeapPush 插入 HeapPop 删除 HeapTop 堆顶元素  HeapEmpty 判空函数 HeapSize 数据个数 4.堆的代码  Heap.h Heap.c Test.c 前言 我们之前所学的结构属于线性结构而树是一种非线性的数据结构它是由nn0个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树也就是说它是根朝上而叶朝下的。 一、树的概念及结构 1 树的概念 树是一种非线性的数据结构它是由nn0个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树也就是说它是根朝上而叶朝下的。 有一个特殊的结点称为根结点根节点没有前驱结点 除根节点外其余结点被分成M(M0)个互不相交的集合T1、T2、……、Tm其中每一个集合Ti(1 i m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱可以有0个或多个后继。因此树是递归定义的。  注意树形结构中子树之间不能有交集否则就不是树形结构 2 树的相关概念  节点的度一个节点含有的子树的个数称为该节点的度 如上图A的为6 叶节点或终端节点度为0的节点称为叶节点 如上图B、C、H、I...等节点为叶节点 非终端节点或分支节点度不为0的节点 如上图D、E、F、G...等节点为分支节点 双亲节点或父节点若一个节点含有子节点则这个节点称为其子节点的父节点 如上图A是B的父节点 孩子节点或子节点一个节点含有的子树的根节点称为该节点的子节点 如上图B是A的孩子节点 兄弟节点具有相同父节点的节点互称为兄弟节点 如上图B、C是兄弟节点 树的度一棵树中最大的节点的度称为树的度 如上图树的度为6  节点的层次从根开始定义起根为第1层根的子节点为第2层以此类推 树的高度或深度树中节点的最大层次 如上图树的高度为4 堂兄弟节点双亲在同一层的节点互为堂兄弟如上图H、I互为兄弟节点 节点的祖先从根到该节点所经分支上的所有节点如上图A是所有节点的祖先 子孙以某节点为根的子树中任一节点都称为该节点的子孙。如上图所有节点都是A的子孙 森林由mm0棵互不相交的树的集合称为森林   树的一种结构体储存形式左孩子右兄弟 typedef int DataType; struct TreeNode {struct TreeNode* pNextBrother;struct TreeNode* firestChild1;DataType data;}; 树在实际中的运用例如树状目录结构 在数据结构中我们基本不使用多分枝树这一结构而使用特殊的树——二叉树 二、二叉树的概念及结构 1.二叉树的概念 一棵二叉树是结点的一个有限集合该集合: 1. 或者为空 2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成 注意 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分次序不能颠倒因此二叉树是有序树 2. 特殊的二叉树 满二叉树一个二叉树如果每一个层的结点数都达到最大值则这个二叉树就是满二叉树。也就是说如果一个二叉树的层数为K且结点总数是2^k - 1 则它就是满二叉树。 完全二叉树完全二叉树是效率很高的数据结构完全二叉树是由满二叉树而引出来的。对于深度为K的有n个结点的二叉树当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。  前h-1层是满的最后一层是连续的 3. 二叉树的性质 1. 若规定根节点的层数为1则一棵非空二叉树的第i层上最多有2^( i - 1) 个结点. 2. 若规定根节点的层数为1则深度为h的二叉树的最大结点数是 2^h - 1 3. 对任何一棵二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为 n2,则有 n0 n21 4. 若规定根节点的层数为1具有n个结点的满二叉树的深度 5. 对于具有n个结点的完全二叉树如果按照从上至下从左至右的数组顺序对所有节点从0开始编号则对于序号为i的结点有   若i0i位置节点的双亲序号(i-1)/2i0i为根节点编号无双亲节点 若2i1n左孩子序号2i12i1n否则无左孩子 若2i2n右孩子序号2i22i2n否则无右孩子 例题1 度为0的结点数为N0 度为1的结点数为N1 度为2的结点数为N2 2n N0 N1 N2 2n N0 N1 N0 - 1 又因为是完全二叉树所以N1要么是0那么是1 2n 2N0 - 1 N1 又因为奇偶数所以N1必为1选A 例题2 因为如果一个完全二叉树高度为h则它的结点数在[2^(h-1) 2^h -1 ]  所以是B 例题3 767  2N0 -1 N1  所以N1为0N0为384选B 4.二叉树的存储结构 二叉树一般可以使用两种结构储存顺序结构、链式结构  4.1 顺序结构 顺序结构存储时使用数组来存储适合表示满二叉树和完全二叉树因为完全二叉树不会有空间的浪费。顺序结构在物理逻辑上时一个数组在逻辑结构上是一棵二叉树。 规定根节点在数组内下标是0根据满二叉树性质我们可以推导出父子节点在数组中的下标关系 parent child - 1/  2leftchild  parent *2 1rightchild parent*2 2 4.2 链式结构  如果是非完全二叉树那么顺序存储就不适合了因为会造成空间的浪费空间利用率不高所以数组存储表示二叉树只适合完全二叉树 三、二叉树的顺序结构及实现  普通的二叉树是不适合用数组来存储的因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事一个是数据结构一个是操作系统中管理内存的一块区域分段。 注意堆在物理逻辑上时一个数组在逻辑结构上是一棵二叉树。 1.堆的性质 堆中某个节点的值总小于等于或大于等于其父节点的值堆是一颗完全二叉树所有父节点大于等于孩子的堆称为大根堆反之所有父节点都小于等于孩子的堆称为小根堆 2.堆的插入 根据堆是大根堆或小根堆来选择向上调整或向下调整向堆内插入数据应按照数组储存顺序挨个插入在插入后要判断其与父节点的大小关系选择向上调整大根堆或向下调整小根堆直到满足条件为止 3.堆的实现 堆的结构体 typedef int HPDataType; typedef struct Heap {HPDataType* a;int size;int capacity; }HP; HeapInit 初始化 void HeapInit(HP* php) {assert(php);php-a (HPDataType*)malloc(sizeof(HPDataType) * 4);if (php-a NULL){perror(malloc fail);return;}php-size 0;php-capacity 4; } HeapPush 插入 插入后需要和父节点比较大小进行向上调整或向下调整所以单独封装一个函数实现该功能判断要插入时size与capacity的值是否相等进而判断是否要扩容在顺序表和栈中我们都学过最坏情况为新插入的数据最大一直交换到根节点 void Swap(HPDataType* p1, HPDataType* p2) {HPDataType x *p1;*p1 *p2;*p2 x; }// 除了child这个位置前面数据构成堆 void AdjustUp(HPDataType* a, int child) {int parent (child - 1) / 2;//父节点就这样算//while (parent 0) 当child 0的时候parent计算之后也是0还会进入循环这是错误的但是又因为if条件不满足所以break跳出循环了这就是著名的虽然错误但是莫名其妙跑起来了while (child 0){if (a[child] a[parent]){Swap(a[child], a[parent]);child parent;parent (child - 1) / 2;}else{break;}} }void HeapPush(HP* php, HPDataType x) {assert(php);if (php-size php-capacity){HPDataType* tmp (HPDataType*)realloc(php-a, sizeof(HPDataType) * php-capacity * 2);if (tmp NULL){perror(realloc fail);return;}php-a tmp;php-capacity * 2;}php-a[php-size] x;php-size;AdjustUp(php-a, php-size - 1);//向上调整因为size了所以size-1 } HeapPop 删除 我们要考虑有意义的删除即如果删除尾部数据堆并没有什么实际的作用而如果我们删除堆顶数据那么我们可以得到第二大或第二小的数据这在现实生活中是有意义的因为生活中有许多排序找到排名前k的数据这是一个有实际需求的功能所以我们删除堆顶元素要删除堆顶数据的话不能挪动删除将后面的数据前移因为这样搞不仅效率低而且搞完之后父子兄弟关系全都会乱最优方法是将堆顶数据与最后一个数据进行交换再删除最后一个数据这样既不会使父子兄弟间关系混乱也能做到有实际意义与会后一个数据交换后堆的结构已经发生改变我们要恢复堆的结构将堆顶元素向下调整即与它的两个孩子中最大的孩子比较大小进而进行交换调整最坏情况到叶子节点在向下调整函数中会出现数组越界风险在循环时要加以判断 // 左右子树都是大堆/小堆 void AdjustDown(HPDataType* a, int n, int parent) {int child parent * 2 1;while (child n){// 选出左右孩子中大的那一个//这里有小问题该点是否有右孩子如果没有那么child1就越界了所以要先判断右孩子是否存在并且还要注意逻辑判断不能写反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 HeapPop(HP* php)//删除要删堆顶数据因为删尾没有什么意义//删了堆顶那么第二大或第二小的数据就会显现出来这对于现实top k问题都是有意义的 {assert(php);assert(!HeapEmpty(php));// 删除数据Swap(php-a[0], php-a[php-size - 1]);php-size--;//size--减小有效范围AdjustDown(php-a, php-size, 0); } HeapTop 堆顶元素  HPDataType HeapTop(HP* php) {assert(php);return php-a[0]; } HeapEmpty 判空函数 bool HeapEmpty(HP* php) {assert(php);return php-size 0; } HeapSize 数据个数 int HeapSize(HP* php) {assert(php);return php-size; } 4.堆的代码  Heap.h #pragma once#includestdio.h #includeassert.h #includestdlib.h #includestdbool.h// typedef int HPDataType; typedef struct Heap {HPDataType* a;int size;int capacity; }HP;void HeapInit(HP* php); void HeapDestroy(HP* php);void HeapPush(HP* php, HPDataType x); void HeapPop(HP* php); HPDataType HeapTop(HP* php); bool HeapEmpty(HP* php); int HeapSize(HP* php);void AdjustUp(HPDataType* a, int child); void AdjustDown(HPDataType* a, int n, int parent);Heap.c #define _CRT_SECURE_NO_WARNINGS 1 #include Heap.hvoid HeapInit(HP* php) {assert(php);php-a (HPDataType*)malloc(sizeof(HPDataType) * 4);if (php-a NULL){perror(malloc fail);return;}php-size 0;php-capacity 4; }void Swap(HPDataType* p1, HPDataType* p2) {HPDataType x *p1;*p1 *p2;*p2 x; }// 除了child这个位置前面数据构成堆 void AdjustUp(HPDataType* a, int child) {int parent (child - 1) / 2;//父节点就这样算//while (parent 0) 当child 0的时候parent计算之后也是0还会进入循环这是错误的但是又因为if条件不满足所以break跳出循环了这就是著名的虽然错误但是莫名其妙跑起来了while (child 0){if (a[child] a[parent]){Swap(a[child], a[parent]);child parent;parent (child - 1) / 2;}else{break;}} }void HeapPush(HP* php, HPDataType x) {assert(php);if (php-size php-capacity){HPDataType* tmp (HPDataType*)realloc(php-a, sizeof(HPDataType) * php-capacity * 2);if (tmp NULL){perror(realloc fail);return;}php-a tmp;php-capacity * 2;}php-a[php-size] x;php-size;AdjustUp(php-a, php-size - 1);//向上调整因为size了所以size-1 }// 左右子树都是大堆/小堆 void AdjustDown(HPDataType* a, int n, int parent) {int child parent * 2 1;while (child n){// 选出左右孩子中大的那一个//这里有小问题该点是否有右孩子如果没有那么child1就越界了所以要先判断右孩子是否存在并且还要注意逻辑判断不能写反if (child 1 n a[child 1] a[child]){child;}if (a[child] a[parent]){Swap(a[child], a[parent]);parent child;//先移动parentchild parent * 2 1;}else{break;}} } //不能挪动删除因为这样搞不仅效率低而且搞完之后父子兄弟关系全都会乱 void HeapPop(HP* php)//删除要删堆顶数据因为删尾没有什么意义//删了堆顶那么第二大或第二小的数据就会显现出来这对于现实top k问题都是有意义的 {assert(php);assert(!HeapEmpty(php));// 删除数据Swap(php-a[0], php-a[php-size - 1]);php-size--;AdjustDown(php-a, php-size, 0); }HPDataType HeapTop(HP* php) {assert(php);return php-a[0]; }bool HeapEmpty(HP* php) {assert(php);return php-size 0; }int HeapSize(HP* php) {assert(php);return php-size; } Test.c #define _CRT_SECURE_NO_WARNINGS 1 #include Heap.hint main() {HP hp;HeapInit(hp);HeapPush(hp, 4);HeapPush(hp, 18);HeapPush(hp, 42);HeapPush(hp, 12);HeapPush(hp, 21);HeapPush(hp, 3);HeapPush(hp, 5);HeapPush(hp, 5);HeapPush(hp, 50);HeapPush(hp, 5);HeapPush(hp, 5);HeapPush(hp, 15);HeapPush(hp, 5);HeapPush(hp, 45);HeapPush(hp, 5);int k 0;scanf(%d, k);while (!HeapEmpty(hp) k--){printf(%d , HeapTop(hp));HeapPop(hp);}printf(\n);return 0; } 总结 本节简单学习了二叉树的概念及顺序存储堆的实现下节将讲解如何使用堆排序分析时间复杂度。 最后如果小帅的本文哪里有错误还请大家指出请在评论区留言ps抱大佬的腿新手创作实属不易如果满意还请给个免费的赞三连也不是不可以流口水幻想嘿那我们下期再见喽拜拜
http://www.huolong8.cn/news/183169/

相关文章:

  • windows做网站的工具网站升级对外解决方案
  • 什么网站可以做家禽交易销售培训课程一般有哪些
  • 郑州做网站九零后建设营销型网站广州
  • 柏乡企业做网站门面设计装修效果图
  • 南昌企业建站系统模板南通自助模板建站
  • php网站开发开题报告srm采购管理系统
  • 网站流量一直做不起来wordpress模板和主题
  • 展示型为主的网站企业网站模板下载需谨慎
  • 长沙网站制作价格网站源码asp
  • 网站营销案例展示商城网站建设公司地址
  • 阜阳市建设工程质量检测站网站做租房信息网站
  • 移动app与网站建设的区别韩国flash网站
  • 企业的网站建设公司做网站赚钱吗
  • 用php做的网站怎么上传百数低代码开发平台
  • 加强网站的建设工作站点传统的推广方式主要有
  • win2008 iis7发布网站网站备份和备案的区别
  • 沭阳网站建设哪家好安顺网站建设公司
  • 论坛类型的网站怎么做网站建设与案例管理的心得体会
  • 东营建设网站门户网站主要特点和功能
  • 购物商城网站的运营新泰建设局网站
  • 北堂网站制作怎么做网站_
  • 如何网站后台清理缓存wordpress主题的使用
  • 网页和网站做哪个好用个人网站备案怎么样才能简单的过
  • 众筹网站哪家好电子商务网站建设规划设计任务书
  • 德德模板网站建设步骤易语言做网站客户端
  • 17做网站郑州ui设计app界面模板
  • 建什么网站收益比较号jsp做的网站运行都需要什么
  • 购买的网站如何换背景中山市网站开发
  • 旺道seo怎么优化网站潍坊手机网站制作
  • 阳光创信-网站建设首选品牌九九建筑网登入