2013-12-11 31 views
0

我已經實現了treap並且添加了方法。所以,當我triyng主要做到這一點在treap中添加錯誤

int main(){ 
    nodeptr root=NULL; 
    treap bst; 
    bst.add(root, 10); 
    // bst.add(root, 9); 
    // bst.add(root, 8); 
    if(bst.find(root, 10)){ 
     cout<<"OMG"; 
    } 
} 

它有行nv->x=x;這樣的錯誤,有所有的代碼添加

void treap::add(nodeptr &p, int x){ 
    nodeptr nv, l, r; 
    nv->x=x; 
    nv->y=random(); 
    nv->left=NULL; 
    nv->right=NULL; 
    split(p, x, l, r); 
    p=merge(merge(l, nv), r); 
} 

爲了找到

bool treap::find(nodeptr &p, int x){ 
    if(!p){ 
     return false; 
    } 
    if(p->x == x){ 
     return true; 
    } 
    else if(x< p->x){ 
     return find(p->left, x); 
    } 
    else{ 
     return find(p->right, x); 
    } 
} 

而對於合併

nodeptr treap::merge(nodeptr l, nodeptr r){ 
    nodeptr result; 
    if (!l){ 
     result=r; 
    } 
    else if(!r){ 
     result=l; 
    } 
    else if(l->cnt > r->cnt){ 
     l->right=merge(l->right, r); 
     result=l; 
    } 
    else{ 
     r->left=merge(l, r->left); 
     result=r; 
    } 
    return result; 
} 

我如何定義treap:

typedef struct node *nodeptr; 
struct node{ 
    int x; 
    long y; 
    node* left ; 
    node* right ; 
    int cnt; 
    node(int key=0, long prior=0): x(key), y(prior), left(NULL), right(NULL), cnt(0) {} 
}; 

class treap{ 
public: 
    int cnt(nodeptr &p); 
    bool find(nodeptr &p, int x); 
    void update_cnt(nodeptr &p); 
    void split(nodeptr &p, int x, nodeptr &l, nodeptr &r); 
    void insert(nodeptr &p, nodeptr &q); 
    nodeptr merge(nodeptr l, nodeptr r); 
    void deletes(nodeptr &p, int x); 
    void add(nodeptr &p, int x); 
}; 

請問你能解釋一下,爲什麼這個錯誤在這裏?先謝謝你。對不起,如果問題是不好意思,我是新來的。

回答

0

行:nodeptr nv, l, r;你只能創建一個指向節點的指針,它並不指向任何有用的東西。您應該爲該節點分配內存,並將該指針指向該分配的內存。 nodeptr nv = new node;(請確保您的delete內存) 更好的是,您可能希望創建該節點的對象控制生命週期,而不是手動處理內存。