左堆
来源:互联网 发布:淘宝客服管理规范 编辑:程序博客网 时间:2024/04/24 06:31
由于oj上有这道题,于是自己写一下
左堆是由于递归的定义来的,所以merge的时候自然也是递归,代码如下:
struct node{ int val; int npl; node *left, *right; node(int x = 0, node* p = NULL, node* q = NULL) :val(x), left(p), right(q) {}};// The function of this function is //return the root of the new tree which is merged by tree1 and tree2node* merge(node* root1, node* root2){ //recursion basis if (root1 == NULL) return root2; if (root2 == NULL) return root1; node *l, *r; // r merge with l->right root1->val < root2->val ? (l = root1, r = root2) : (l = root2, r = root1); l->right = merge(l->right, r); if (l->left == NULL || l->right->npl > l->left->npl) swap(l->right, l->left); l->npl = l->left->npl + 1; return l;}
其实在网上还有流传的做法,代码如下
struct node{ int val; int npl; node *left, *right; node(int x = 0, node* p = NULL, node* q = NULL) :val(x), left(p), right(q) {}};node* mergesort(node* H1, node* H2);node* merge(node* H1, node* H2){ if (H1 == NULL) return H2; if (H2 == NULL) return H1; if (H1->val > H2->val) return mergesort(H2, H1); else return mergesort(H1, H2);}node* mergesort(node* H1, node* H2)//H2 to H1{ if (H1->left == NULL) H1->left = H2; else { H1->right = merge(H1->right, H2); if (H1->left->npl < H1->right->npl) { node *tmp; tmp = H1->right; H1->right = H1->left; H1->left = tmp; } H1->npl = H1->right->npl + 1; } return H1;}
我自己觉得代码一还是更接近本质一点
0 0
- 左堆
- 水晶报表左堆对齐
- 左堆(Leftist Heaps)
- [第二节]C++ 引用 函数调用作为左值 用const限定引用 返回堆中变量的引用
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- Python学习笔记(7)--lambda表达式的用法
- USACO 1.3 混合牛奶 (贪心)
- 海量数据面试题整理
- 王学岗RxJava(十三)
- 浅析Java中的final关键字
- 左堆
- 洛谷 P1007 独木桥
- Java核心技术之String,stringBuffer,stringBuilder
- html 选择列表
- 2016.11.12
- USACO 2.1 三值的排序 (杂项)
- 使用shell命令调用matlab
- 触摸屏工作原理解析
- cas添加验证码以及默认错误几次以后才出现验证码