|
5#
楼主 |
发表于 2020-3-29 18:44:53
|
只看该作者
再看看删除的过程,和标准BST相比,有哪些区别?
- void Del(int &rt,int x)
- {
- if(rt>0)
- if(a[rt].val==x)
- {
- if(a[rt].cnt>1) a[rt].cnt--, a[rt].sz--; //有相同的就直接cnt--
- else
- {
- if (a[rt].ls==0) rt=a[rt].rs; ///右子树接上来
- else if (a[rt].rs==0) rt=a[rt].ls;///左子树接上来
- else
- {
- if (a[a[rt].ls].rd>a[a[rt].rs].rd) RR(rt);else LR(rt); ///rd调整
- Del(rt,x);
- }
- }
- }
- else
- {
- a[rt].sz--;
- if (a[rt].val<x) Del(a[rt].rs, x);
- else Del(a[rt].ls, x);
- }
- }
复制代码
由于已经有了旋转的操作,所以我们大可以找到后。把要删除的那个节点的某个rd较小的儿子转上来当根,把他往下压。直到他没左右儿子为止。然后直接删除。 |
|