左堆

来源:互联网 发布:淘宝客服管理规范 编辑:程序博客网 时间: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
原创粉丝点击