AVL树无法计算树的高度

时间:2013-12-10 17:13:02

标签: c++ oop tree avl-tree

我是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;

}

所以,你能解释一下,为什么我的机会不起作用?或者插入中有错误(但我认为插入有效,但可能是我错了)。提前谢谢。

1 个答案:

答案 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的实际实例一样。