删除偏斜堆的方法
Remove method for Skew heap?
我正在尝试创建偏斜的堆类,但是我在从堆中删除元素的ememove函数在代码的末尾有问题。逻辑似乎正确。合并其孩子。任何建议?
struct node{
int key;
node* left;
node* right;
};
class skewHeap{
public:
skewHeap(int k);
~skewHeap();
skewHeap& operator=(const skewHeap&);
node* merge(node* a,node* b);
void remove(node* a,int k);
void add(int k);
void print(node*) const;
node* getRoot();
private:
node* root;
void del(node* n){
if(n == NULL) return;
else{
del(n->left);
del(n->right);
delete n;
}
}
node* copy(node* n){
if(n == NULL) return NULL;
node* tmp = new node;
tmp->key = n ->key;
tmp->left = copy(n->left);
tmp->right = copy(n->right);
return tmp;
}
};
skewHeap::skewHeap(int k){
root = new node;
root->key = k;
root->left = NULL;
root->right = NULL;
}
skewHeap::~skewHeap(){
del(root);
}
skewHeap& skewHeap::operator=(const skewHeap& n){
if( this != &n){
del(root);
root = n.root;
copy(root);
}
return *this;
}
node* skewHeap::merge(node* a,node* b){
if(a == NULL) return b;
if(b == NULL) return a;
else {
if(a->key > b->key){
node* tmp = a;
a = b;
b = tmp;
}
node* tmp = a->right;
a->right = a->left;
a->left = merge(b,tmp);
}
return a;
}
void skewHeap::add(int k){
node* p = new node;
p->key = k;
p->left = NULL;
p->right = NULL;
root = merge(root,p);
}
void skewHeap::print(node* n) const{
if(n == NULL) return;
else{
print(n->left);
cout<<n->key<<" ";
print(n->right);
}
}
node* skewHeap::getRoot(){
return root;
}
void skewHeap::remove(node* n,int k){
if( n == NULL) return;
if(n->key == k) {
n = merge(n->left,n->right);
return;
}
remove(n->left,k);
remove(n->right,k);
}
这可以正常工作(使用此方法跳过根)
node* skewHeap::remove(node* n,int k){
if( n == NULL) return NULL;
if(n->left && n->left->key == k) {
n->left = merge(n->left->left,n->left->right);
return n;
}
if(n->right && n->right->key == k) {
n->right = merge(n->right->left,n->right->right);
return n;
}
remove(n->left,k);
remove(n->right,k);
}
相关文章:
- 检测win32服务创建和删除的最佳方法
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 一种从内存中删除 UTF 字节的方法?
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- 在析构函数中删除单链表的正确方法是什么?
- 处理从列表中删除指向对象的指针的"healthy"方法是什么?
- 删除类成员的动态分配内存的最佳方法是什么
- 从浮点数中删除小数部分但保留类型的有效方法
- 如果方法在类中定义,则阻止编译器删除方法
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- 有没有一种预处理器的方法可以从调试符号中删除代码段
- 删除父/子窗口层次结构的最佳方法
- 工厂方法创建的对象应该在哪里删除?
- 如何通过最快的方法删除指定的标签组件
- 无法使用擦除方法删除矢量的最后一个元素
- 尝试使用窗口注册表中的路径和 DeleteFile() 方法删除.exe文件
- 通过此方法删除链表中的数据会发生什么情况
- 如何使用c++使用流的方法删除文件
- 如何通过析构函数方法删除对象(类)
- 标准的c++11方法删除一个类型的所有指针