左堆

由于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;
}

我自己觉得代码一还是更接近本质一点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值