2014-11-26 8 views
-6

에 관계없이 항목에 존재하는 동일한를 반환 여기 내 코드입니다 :검색 기능은 이진 검색 트리

#include<iostream.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<process.h> 

struct tree_node 
{ 
    tree_node *left; 
    tree_node *right; 
    int data; 
    char r; 
} ; 
class bst 
{ 
    tree_node *root; 
    public: 
    bst() 
    { 
     root=NULL; 
    } 
    int isempty() 
    { 
     return(root==NULL); 
    } 
    void insert(int item); 
    void inordertrav(); 
    void inorder(tree_node *); 
    void postordertrav(); 
    void postorder(tree_node *); 
    void preordertrav(); 
    void preorder(tree_node *); 
    int search(tree_node * ,int); 
}; 
void bst::insert(int item) 
{ 
    tree_node *p=new tree_node; 
    tree_node *previous; 
    p->data=item; 
    p->left=NULL; 
    p->right=NULL; 
    previous=NULL; 
    if(isempty()) 
     root=p; 
    else 
    { 
     tree_node *current; 
     current=root; 
     while(current!=NULL) 
     { 
      previous=current; 
      if(item<current->data) 
       current=current->left; 
      else 
       current=current->right; 
     } 
     if(item<previous->data) 
      previous->left=p; 
     else 
      previous->right=p; 
    } 
} 

int bst::search(tree_node* root,int data) { 
    int r; 
    if(root == NULL) { 
     // r='f'; 
     return 0; 
    } 
    else if (root != NULL){ 
    if(root->data == data) { 
     // r='t'; 
     return 1; 
    } 
    } 
    else if(data <= root->data) { 
      return search(root->left,data); 
    } 
    else { 
      return search(root->right,data); 
    } 

} 
void main() 
{ 
    int digit; 
    bst b; 
    tree_node *root; 
    /*b.insert(52); 
    b.insert(25); 
    b.insert(50); 
    b.insert(15); 
    b.insert(40); 
    b.insert(45); 
    b.insert(20); */ 
    cout<<"insert the nodes in the BT"; 
    cout<<"enter integer: to quit enter 0"; 
    cin>>digit; 
    while (digit!=0) 
    { 
     b.insert(digit); 
     cin>>digit; 
    } 
     cout<<"inorder"<<endl; 
    b.inordertrav(); 
    cout<<endl<<"postorder"<<endl; 
    b.postordertrav(); 
    cout<<endl<<"preorder"<<endl; 
    b.preordertrav(); 
    int number; 
    cout<<"Enter number be searched\n"; 
    cin>>number; 
    //If number is found, print "FOUND" 
    int c; 
    c=b.search(root,number); 
    cout<<"returned value"<<c; 
    if (c==1) cout<<"Found\n"; 
    else cout<<"Not Found\n"; 
    getch(); 
} 

검색 기능이 항상이 BST에 있는지 여부와 상관없이 같은 값을 반환은. 오류를 알아내는 데 도움주세요. 위의 코드에는 컴파일 오류가 없습니다. 검색 기능을 제외한 다른 모든 기능이 정상적으로 작동합니다. 그러나 요소가 이진 검색 트리에 있는지 여부를 검색하는 데 필요한 검색 기능이 작동하지 않습니다.

+0

안녕하세요, 코드를 수정하고 형식을 지정하십시오. 그것이 그렇듯이, 읽고 이해하기가 어렵습니다. – utnapistim

+0

'search'의 처음 두 조건을 살펴보고 두 조건이 모두 거짓 인 경우를 찾으십시오. 브래킷 배치 문제가 있다고 생각합니다. – molbdnilo

+0

이 프로그램과 같은 작은 프로그램을 디버깅하는 방법에 대해서는 [Eric Lippert의 훌륭한 블로그 게시물] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 읽어야합니다. 기술은 설명했다. –

답변

0

코드에서 UB를 호출합니다. bst::search 기능에서 또한

class bst 
{ 
    ... 
    int search(tree_node * ,int); 
    int search(int v) { 
     return search(root, v); 
    } 
}; 

:

else //if (root != NULL){ Comment this condition 
if(root->data == data) { 
    // r='t'; 
    return 1; 
} 
//} Comment this line 

이 조건은 중복이 아니라도 할 몇 가지 코드 흐름 경로가 값없이 반환

tree_node *root; 
... 
c=b.search(root,number); // root is uninitialized 

이 새로운 기능을 추가 해결하기 .

+0

여전히 프로그램에서 필요한 출력을 제공하지 않습니다. –

+0

@VarunGalar 근무 [잘 여기] (http://ideone.com/i0l7IS) –

+0

많은 도움을 주셔서 고마워요. –