我是oop编程的新手,所以这个问题似乎很蠢。对不起,如果是的话。所以,这里是我对AVL树的实现,这里我假设函数insert和delete工作正常,但getHight在任何情况下都给我0。
#include <iostream>
using namespace std;
class node{
private:
int key;
node(int k) {key=k; left=right=0; height=1;}
int data;
int height;
node* left;
node* right;
public:
int getheight(node* p){
if(p){
return p->height;
}
else{
return 0;
}
}
int balancefactor(node* p){
return getheight(p->right)-getheight(p->left);
}
void fixheight(node* p){
int hl=getheight(p->left);
int hr=getheight(p->right);
if (hl>hr){
p->height=hl+1;
}
else{
p->height=hr+1;
}
}
node* rotateright(node* p){
node*q=p->left;
p->left=q->right;
q->right=p;
fixheight(p);
fixheight(q);
return q;
}
node* rotateleft(node* q){
node*p=q->left;
q->right=p->left;
p->left=q;
fixheight(q);
fixheight(p);
return p;
}
node* balance(node* p){
fixheight(p);
if(balancefactor(p)==2){
if(balancefactor(p->right) < 0){
p->right=rotateright(p->right);
}
return rotateleft(p);
}
if (balancefactor(p)==-2){
if(balancefactor(p->left)>0){
p->left=rotateleft(p->left);
}
return rotateright(p);
}
return p;
}
node* insert(node* p, int k){
if (!p) return new node(k);
if(k<p->key){
p->left=insert(p->left, k);
}
else{
p->right=insert(p->right, k);
}
return balance(p);
}
node* findmin(node* p){
if (p->left){
return findmin(p->left);
}
else{
return p;
}
}
node* removemin(node* p){
if(p->left==0){
return p->right;
}
p->left=removemin(p->left);
return balance(p);
}
node* remove(node* p, int k){
if(!p) return 0;
if(k<p->key){
p->left=remove(p->left, k);
}
else if (k>p->key){
p->right=remove(p->right, k);
}
else{ //k==p->key
node* q=p->left;
node* r=p->right;
delete p;
if(!r) return q;
node* min = findmin(r);
min->right=removemin(r);
min->left=q;
return balance(min);
}
return balance(p);
}
};
int main(){
node *root = NULL;
root->insert(root, 10);
root->insert(root, 20);
root->insert(root, 30);
root->insert(root, 40);
root->insert(root, 50);
root->insert(root, 25);
root->remove(root, 25);
int c =root->getheight(root);
cout<<c;
}
所以,你能解释一下,为什么我的机会不起作用?或者插入中有错误(但我认为插入有效,但可能是我错了)。提前谢谢。
答案 0 :(得分:0)
int main(){
node *root = NULL;
root->insert(root, 10);
root->insert(root, 20);
root->insert(root, 30);
root->insert(root, 40);
root->insert(root, 50);
root->insert(root, 25);
root->remove(root, 25);
int c =root->getheight(root);
cout<<c;
}
您正在使用初始化为NULL
的指针,就好像它指向node
的实际实例一样。