2012-07-25 3 views
0

이것은 이진 검색 트리 구현입니다. 왜 내 최소 방법 (트리에서 최소 요소를 찾는)이 정답을 반환하지 않고 임의의 메모리 주소인지 파악할 수 없습니다. 이 생성자 BST (3);에 의해 트리를 만들고 있는데, 이제 min()을 실행하면 올바르게 3을 반환하지만 1 (insert (1) 메서드 삽입) 후 min()은 16 진수 주소를 반환합니다.내 최소 방법 (이진 검색 트리)에 어떤 문제가 있습니까?

class node{ 
    public: 
    int key; 
    node *left; 
    node *right; 
    node *parent; 
}; 
class BST{ 
    node *root; 
    public: 
    BST(){} 
    BST(int a){ 
     root=new node(); 
     root->left=NULL; 
     root->right=NULL; 
     root->parent=NULL; 
     root->key=a; 
    } 
    void insert(int n) 
    { 
     if(search(n))return; 
     node *p=root; 
     node *m=new node; 
     m->key=n; 
     m->left=NULL; 
     m->right=NULL; 

    while(1) 
    { 
     if(p->key > n) 
     { 
      //look left 
      if(p->left==NULL) 
      { 
       p->left=m; 
       m->parent=p; 
       return; 
      } 
      else 
       p=p->left; 



     } 
     else 
     { 
      //look right 
      if(p->right==NULL) 
      { 
       p->right=m; 
       m->parent=p; 
       return; 
      } 
      else 
       p=p->right; 

     } 
    } 
} 
bool search(int n) 
{ 
    node *p=root; 
    while(1) 
    { 
     if(p->key > n) 
     { 
      //look left 
      if(p->left==NULL) 
       return false; 

      else 
       p=p->left; 



     } 
     else if(p->key==n)return true; 
     else 
     { 
      //look right 
      if(p->right==NULL) 
       return false; 

      else 
       p=p->right; 

     } 
    } 

} 
int min() 
{ 
    node *p=root; 
    if(p->left == NULL) 
    return (p->key); 
    p=p->left; 
} 
}; 

답변

2

모든 제어 경로에 반환하지 않는 방법으로 정의되지 않은 동작으로 실행되므로 :

int min() 
{ 
    node *p=root; 
    if(p->left == NULL) 
     return (p->key); 
    p=p->left; 
    //no return here 
} 

p->left가 아닌 경우 NULL, 어떤 일이 일어날 수 있다는 것을 의미합니다. 아무것도!

int min() 
{ 
    node *p=root; 
    while (p->left != NULL) 
     p=p->left; 
    return (p->key); 
} 
+0

감사합니다.이 바보 같은 실수를했습니다 ... 어떻게 질문을 삭제합니까? – Jignesh

+0

@ user1343868 내 코드가 더 깨끗하다고 ​​생각하지만 그것은 사용자에게 달려 있습니다. –

+0

@ user1343868 게시물을 삭제하려면 [this] (http://meta.stackexchange.com/questions/25088/how-can-i-delete-my-post-on-stack-overflow)를 선택하십시오. – Deqing

0

p->left != NULL 경우, 당신은 아무것도 반환하지 않습니다 대신이 루프를 원하는처럼

는 것 같습니다.