2013-12-10 105 views
0

我是一個新的oop編程,所以這個問題似乎是nooby。對不起,如果是的話。所以,這裏是我的AVL樹的實現,在這裏我假設函數插入和刪除工作正常,但getheight在任何情況下都給我0。AVL樹不能計算樹的高度

#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; 

} 

那麼,你能弄明白我爲什麼我的getheight不工作嗎?或者插入錯誤(但我想插入的作品,但可能是我錯了)。提前致謝。

+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一個真正的實例的指針。