【随笔】排序二叉树的删除问题

来源:互联网 发布:网络新媒体优势 编辑:程序博客网 时间:2024/05/16 11:14

无论是否是平衡的排序二叉树,删除某个节点一直都是不太好写的函数...

暂且不说平衡二叉树,简单的排序二叉树都不太好删除...

一般都是找到以被删除节点的下一个值(根据排序的次序)来顶这个节点,然后这个节点的查找就不是几句话说得清的了...

排序二叉树我曾经是把待删除节点旋转到叶子再删除...Treap树也可以类似这么做...

Treap叫做踩的话,splay树只能顶上根去再删除...

此外偷懒的方式就是开个bool记录节点被删除没...删除这么麻烦,写个插入负的就等效了...

问题还是要解决的...


对于删除节点可以转到叶子删除的:

void erase(node *&root,int x){node *temp = root;if(root->lchild != null)root = root->lchild;elseif(root->rchild != null)root = root->rchild;delete temp;}

注意这种写法需要保证整个树需要使用自定义的null节点来标记无后继,不能使用默认的空指针NULL。


对于不方便旋转到叶子层删除的形式:

void erase(node *&root,int x){node *temp = root;if(root->lchild != null && root->rchild == null)root = root->lchild;delete temp;}else if(root->lchild == null && root->rchild == null){root = null;delete temp;}else {temp = root->rchild;while(temp->lchild != null)temp = temp->lchild;root->key = temp->key;erase(root,temp->key);}}

这种想法感觉挺奇妙的,沙茶又学到了新的姿势...


原创粉丝点击