由于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 tree2
node* 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;
}
我自己觉得代码一还是更接近本质一点
1785

被折叠的 条评论
为什么被折叠?



