堆排序的思想堆排序的具体算法,思想是每次取出堆的最顶层根节点,即数组下标为0,然后与最后一个节点即i+1交换。
参考地址建堆过程:
首先将原始队列构建成完全二叉树
然后从第一个非叶子节点开始,比较当前节点和其孩子节点,将最大的元素放在当前节点,交换当前节点和最大节点元素。
注意:如果根节点是a[0],那么第一个非叶子节点就是倒数第二层的最后一个根节点,下标为length/2-1
将当前元素前面所...
分类:
编程语言 时间:
2015-08-26 15:48:18
阅读次数:
143
堆排序的堆不是指内存区域里面的堆,而是一种数据结构。堆可以分为“大顶堆”和“小顶堆”,堆其实是一种特殊的二叉树,“大顶堆”中根元素总比叶子元素大,“小顶堆”中根元素总比叶子节点小。当然要创建这样的堆结构还是有一定难度的,请自行参考其他资料。
这里我们使用到的是 STL 中的 priority_queue 这个结构,这个默认就是一个“大顶堆”,所以用这个数据结构我们来实现排序就很简单了。代码...
分类:
编程语言 时间:
2015-08-21 19:35:26
阅读次数:
209
题意:给你n个节点的树,从1节点开始走,到每个节点都有三种情况,被杀死回到1节点,找到隐藏的出口出去,沿着当前节点相邻的边走到下一个节点,给出每个节点三种情况发生的概率分别为ki,ei,1-ki-ei,求找到出口时已经过的边数的期望。分析:用树状dp考虑问题。当节点是叶子节点时它只是向父节点走,非叶...
分类:
其他好文 时间:
2015-08-21 00:03:29
阅读次数:
170
题目:
Given a binary tree, return all root-to-leaf paths.
For example, given the following binary tree:
1
/ 2 3
5
All root-to-leaf paths are:
["1->2->5", "1->3"]
...
分类:
编程语言 时间:
2015-08-20 22:38:02
阅读次数:
259
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。
对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。
使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O...
分类:
其他好文 时间:
2015-08-20 17:01:26
阅读次数:
160
今天做了一道题,发现需要返回根节点,不想多想,就上网搜了一下,发现其中提供的办法都是需要使用父节点,其实并不需要使用父节点。
只需要使用递归函数返回值就可以struct T{
int x;
T *lchild,*rchild;
};
T* init(T* &t){//树t的初始状态为t=NULL;e==0说明没有叶子节点
int e;
scanf("%d",&e...
分类:
编程语言 时间:
2015-08-20 16:56:09
阅读次数:
214
题意:给一棵满二叉树,叶子节点赋予权值,0或者1,对于每个查询输出叶子节点的权值,每个查询0代表往左走,1代表往右走,这题坑的地方是层的访问顺序,如第二组测试,由上到下依次是x3,x1,x2,假如给一个查询110,则从上到下的顺序是011,对应第3个叶子节点。二进制数转变成十进制数对应的叶子的权值,...
分类:
其他好文 时间:
2015-08-19 22:37:32
阅读次数:
155
如果我们把二叉树视为一个图,父子节点之间的连线视为双向的,我们姑且定义为“举例”为两节点之间边的个数。写一个程序求一颗二叉树中相距最远的两个节点之间的距离(《编程之美》3.8)思路:如果两个节点相距最远,一定是两个叶子节点,或者是一个叶子节点到它的根节点。 根据相距最远的两个节点一定是叶子节...
分类:
编程语言 时间:
2015-08-19 00:11:29
阅读次数:
222
题意:每次操作新加两个叶子节点,每次操作完以后询问树的直径。维护树的直径的两个端点U,V,每次计算一下新加进来的叶子节点到U,V两点的距离,如果有更长的就更新。因为根据树的直径的求法,若出现新的直径,一定是到U或者到V距离最远。 1 #include 2 #include 3 #include .....
分类:
其他好文 时间:
2015-08-17 13:53:08
阅读次数:
202
就是比普通的并查集多了个删除操作,显然叶子节点容易删,问题在于可能删根节点。
既然叶子节点容易,我们就把所有的点都变成叶子。我是多开了n个虚拟节点。
(因为我的集合合并是直接连两个根,所以那些有效节点的父亲肯定一直是虚拟节点,所以删除的时候只要考虑一个点就行....其实我是后来才发现,这算是水过吗 QAQ)...
分类:
其他好文 时间:
2015-08-16 19:49:49
阅读次数:
90