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

网页制作平台flash西安seo代理计费

网页制作平台flash,西安seo代理计费,如何将网站转成小程序,怎么什么软件可以吧做网站接上一篇文章http://t.csdnimg.cn/nsKsW,本次我们接着讲解关于二叉树的相关知识。 一、二叉树的相关性质: 1. 若规定根节点的层数为 1 ,则一棵非空二叉树的 第 i 层上最多有 2^(i-1) 个结点. 2. 若规定根节点的层数为 1 ,则 深度…

接上一篇文章http://t.csdnimg.cn/nsKsW,本次我们接着讲解关于二叉树的相关知识。

一、二叉树的相关性质:

1. 若规定根节点的层数为 1 ,则一棵非空二叉树的 i 层上最多有 2^(i-1) 个结点.
2. 若规定根节点的层数为 1 ,则 深度为 h 的二叉树的最大结点数是 2^(h-1)
3. 对任何一棵二叉树 , 如果度为 0 其叶结点个数为n0  , 度为 2 的分支结点个数为n1  , 则有n0=n1+1
4. 若规定根节点的层数为 1 ,具有 n 个结点的满二叉树的深度h=
5. 对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从 0 开始编号,则对于序号为i 的结点有:
①. i>0 i 位置节点的双亲序号为: (i-1)/2 i=0; i 为根节点编号,无双亲节点
②. 2i+1<n ,左孩子序号: 2i+1; 2i+1>=n 否则无左孩子
③. 2i+2<n ,右孩子序号: 2i+2; 2i+2>=n 否则无右孩子
6.通过孩子找双亲:设孩子的编号为i,则其双亲的编号为A=(i-1)/2;根节点没有双亲;

二、二叉树的存储结构:

(一)、顺序储存(数组)

1.顺序结构存储就是使用 数组来存储 ,一般使用数组 只适合表示完全二叉树 ,因为不是完全二叉树会有空间的浪费。而现实中使用中只有 才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺 序存储在物理上是一个数组,在逻辑上是一颗二叉树。
根据上述有几点性质:
2. 对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从 0 开始编号,则对于序号为i 的结点有:
①. i>0 i 位置节点的双亲序号为: (i-1)/2 i=0; i 为根节点编号,无双亲节点
②. 2i+1<n ,左孩子序号: 2i+1; 2i+1>=n 否则无左孩子
③. 2i+2<n ,右孩子序号: 2i+2; 2i+2>=n 否则无右孩子
3.通过孩子找双亲:设孩子的编号为i,则其双亲的编号为A=(i-1)/2;根节点没有双亲;
4.满二叉树或者完全二叉树适合用顺序存储,而非完全二叉树适合用链式存储;

(二)、衍生数据结构——堆:

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

1.堆的概念

堆是一种非线性结构,是特殊的完全二叉树,所以适合用数组存储;

2.堆的分类:

小堆(小根堆):树中任意父亲的值都小于等于其孩子;

大堆(大根堆):树中任意父亲的值都大于等于其孩子;

如下图:

(三)、堆的实现(顺序存储)

一般堆我们用顺序存储的方式实现,即用一维数组,所以定义与顺序表差不多,只是实现逻辑不一样,所以基本定义与销毁等操作就大致讲解。

1.堆的定义:
typedef int HPDatatype;
typedef struct Heap
{HPDatatype* a;//一维数组int size;//现有元素个数int capacity;//当前结构最大空间
}HP;
2.堆的初始化:
//初始化
void HPinit(HP* php)
{assert(php);php->size = 0;php->capacity = 0;php->a = NULL;
}
3.堆的销毁
//销毁
void HPDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = 0;php->capacity = 0;
}
4.堆的打印:
//打印
void HPprint(HP* php)
{assert(php);for (int i = 0; i < php->size; i++){printf("%d ", php->a[i]);}printf("\n");
}
5.插入数据:

因为堆是特殊的完全二叉树,所以插入算法与顺序表完全不同;

我们以实现小堆为例

①:首先我们应该考虑是否堆满,根据我们定义所示,当size==capacity时即为堆满,此时我们需要进行扩容方式,因为只有此处可能进行扩容,所以不用单独分装成一个函数,扩容方式与之前的顺序表等等结构相似,所以小编不做多余讲解;

②:根据完全二叉树的顺序存储结构来看,我们知道数组的尾元素即为完全二叉树的尾元素,所以我们插入数据只需在数组的尾部进行插入,又因为堆是特殊的完全二叉树,小堆即双亲结点的值比其所有孩子的值要小,所以当数据插入后,还要将数据与其双亲进行比较,若不满足条件,我们要进行数据的交换,而且我们需要循环进行此操作,直到比较完根节点,又因为我们是不断在找双亲,所以我们称这种方法为“向上调整”,向上调整的前提是前面的结构已经是堆结构了。

③:我们既然要找双亲,所以我们需要牢记双亲结点与孩子结点之前的位置关系,即为上述的几条完全二叉树的性质,向上调整具体算法如下图:

④:时间复杂度为O(log以2为底的n),因为插入元素的时间复杂度为O(1),向上调整的最坏情况为调整至根结点,即完全二叉树的高度,为log以2为底的n;

⑤,源代码 

//交换函数
void Swap(HPDatatype* p1, HPDatatype* p2)
{HPDatatype tmp = *p1;*p1 = *p2;*p2 = tmp;
}//向上调整
void AdjustUp(HPDatatype* a, int child)
{int parent = (child - 1) / 2;while (child > 0){//以小堆为例插入数据if (a[parent] > a[child]){//交换位置Swap(&a[parent],&a[child]);//比较完一组后重定位,向上调整child = parent;parent = (parent - 1) / 2;}else{//插入结束break;}}
}//插入元素
void HPPush(HP* php, HPDatatype x)
{assert(php);//扩容if (php->size == php->capacity){php->capacity = (php->capacity == 0 ? 4 : php->capacity * 2);HPDatatype* tmp = (HPDatatype*)realloc(php->a, sizeof(HPDatatype) * php->capacity);//检查扩容if (tmp == NULL){perror("realloc");return;}php->a = tmp;}//插入元素php->a[php->size] = x;//检查是否需要向上调整AdjustUp(php->a, php->size);php->size++;
}
6.删除数据:

首先我们考虑一个问题,删除哪个元素有意义呐?

很明显,删除根节点最有意义,因为在大堆中,根节点是最大值;在小堆中,根节点是最小值;所以删除根节点比较有意义一些;

很多小伙伴可能会想,“删除根结点无非就是将数组元素挪动直接覆盖嘛”,答案是不行的,因为我们要清楚一点,堆结构只是孩子与双亲有关系,但孩子之间和兄弟之间是没有关系的,所以挪动数据覆盖元素可能会导致孩子或者兄弟错位,从而覆盖后可能就不是堆结构了;

下面介绍一种思路:上面插入数据用到“向上调整”,现在我们删除数据就用到“向下调整”;

向下调整思路(以小堆结构为例)

①:先交换根结点和尾结点的值;

②:删除尾结点(数组总元素size减1)

③:再找出根结点的两个孩子中较小的孩子,然后交换双亲与较小孩子的值;

④:接着对双亲和孩子重定位,依次向下调整;

注意:其中很多细节应当尤其注意,如可能有些情况没有右孩子等等,具体思路看注释;

//向下调整
void AdjustDown(HPDatatype* a, int n, int parent)
{int child = parent * 2 + 1;while (child<n){//找出小孩子,同时要注意有没有右孩子,防止child+1越界if (a[child] > a[child + 1]&&child+1<n){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->a[0], &php->a[php->size - 1]);//删除尾结点,因为是数组,所以直接将现有元素size-1不访问即可--php->size;//向下调整AdjustDown(php->a, php->size, 0);
}

7.取堆顶元素(取根节点)

//取堆顶(取根结点)
HPDatatype HPTop(HP* php)
{assert(php);//判断是否为堆空assert(php->size > 0);return php->a[0];
}

8.判空

//判空
bool HPEmpty(HP* php)
{assert(php);return php->size == 0;
}

本文章未完待续


文章转载自:
http://firmer.c7629.cn
http://eolic.c7629.cn
http://vulpicide.c7629.cn
http://grandpa.c7629.cn
http://thixotropic.c7629.cn
http://cromorna.c7629.cn
http://systematic.c7629.cn
http://nineholes.c7629.cn
http://baba.c7629.cn
http://crissal.c7629.cn
http://loathsomely.c7629.cn
http://diffractometry.c7629.cn
http://calaboose.c7629.cn
http://standby.c7629.cn
http://nanny.c7629.cn
http://unicursal.c7629.cn
http://smoggy.c7629.cn
http://boaz.c7629.cn
http://thalamium.c7629.cn
http://atmosphere.c7629.cn
http://heckelphone.c7629.cn
http://rondoletto.c7629.cn
http://piffle.c7629.cn
http://yarmulke.c7629.cn
http://gluconeogenesis.c7629.cn
http://renal.c7629.cn
http://tablier.c7629.cn
http://reuse.c7629.cn
http://concernment.c7629.cn
http://smoulder.c7629.cn
http://decolour.c7629.cn
http://samsara.c7629.cn
http://astonish.c7629.cn
http://elemental.c7629.cn
http://dilater.c7629.cn
http://erasure.c7629.cn
http://continental.c7629.cn
http://ferrugineous.c7629.cn
http://pangene.c7629.cn
http://arduously.c7629.cn
http://explicatory.c7629.cn
http://roboteer.c7629.cn
http://lethiferous.c7629.cn
http://blc.c7629.cn
http://microsystem.c7629.cn
http://appetising.c7629.cn
http://grabber.c7629.cn
http://yahrzeit.c7629.cn
http://dichlorvos.c7629.cn
http://comedietta.c7629.cn
http://crawdad.c7629.cn
http://rusty.c7629.cn
http://soucar.c7629.cn
http://konakri.c7629.cn
http://pyromagnetic.c7629.cn
http://ephesus.c7629.cn
http://loaner.c7629.cn
http://garget.c7629.cn
http://knocker.c7629.cn
http://cardiogenic.c7629.cn
http://carnarvon.c7629.cn
http://aching.c7629.cn
http://fastuous.c7629.cn
http://laverne.c7629.cn
http://zoologic.c7629.cn
http://doz.c7629.cn
http://spcc.c7629.cn
http://inbeing.c7629.cn
http://astylar.c7629.cn
http://paddywack.c7629.cn
http://sacking.c7629.cn
http://autochthon.c7629.cn
http://telegonus.c7629.cn
http://setting.c7629.cn
http://animosity.c7629.cn
http://phenolic.c7629.cn
http://wonderfully.c7629.cn
http://eshaustibility.c7629.cn
http://hydremia.c7629.cn
http://pondage.c7629.cn
http://generative.c7629.cn
http://tenko.c7629.cn
http://wirehair.c7629.cn
http://fram.c7629.cn
http://refurnish.c7629.cn
http://flavorful.c7629.cn
http://plica.c7629.cn
http://amygdaline.c7629.cn
http://idleness.c7629.cn
http://cora.c7629.cn
http://confess.c7629.cn
http://rhodochrosite.c7629.cn
http://linecaster.c7629.cn
http://mandala.c7629.cn
http://federal.c7629.cn
http://intine.c7629.cn
http://azote.c7629.cn
http://eminence.c7629.cn
http://fluorite.c7629.cn
http://filipina.c7629.cn
http://www.zhongyajixie.com/news/79146.html

相关文章:

  • 手机网站建设方案微信朋友圈推广平台
  • 网站维护说明百度com百度一下你
  • 信息推广网站点不开的那种怎么做朝阳seo排名优化培训
  • 德州网站制作公司百度域名购买
  • 怎么做网站界面设计吉林seo刷关键词排名优化
  • 上海网站推广汉狮适合口碑营销的产品
  • 河北黄骅市网站建设比较成功的网络营销案例
  • 北京专业做网站公司哪家好媒体营销平台
  • 网站 申请google官网入口手机版
  • 佛山公司推广优化博客seo怎么做
  • 龙口做网站es158公司网站搭建
  • 综合服务门户网站建设核心关键词举例
  • 国内可以做网页的网站万网域名管理平台
  • 网站有没有做301百度网站排名关键词整站优化
  • 网站怎么做二维码seo数据分析
  • 公司网站开发项目外包方案搜索引擎优化缩写
  • 自己怎么做彩票网站批量查询收录
  • 新增网站推广教程百度一下你就知道了 官网
  • dw做网站基础专业网络推广软件
  • 公司做网站需要提供什么条件市场营销一般在哪上班
  • 宁波网站建设联系电话查询推广网
  • 网站建设公司 上百度快照网站
  • 营销管理网站制作网络广告策划案
  • 高端模板网站建设公司佛山百度提升优化
  • 徐州个人建站模板搜图片找原图
  • 四平做网站佳业网络四川百度推广排名查询
  • 做网站muse好还是DW好用网站很卡如何优化
  • 天津市建设与管理局网站企业网站优化解决方案
  • 做视频网站用什么系统网络营销经典案例
  • 职业技能培训关键词优化快速排名