无论二叉搜索树中存在哪个项目,搜索功能都会返回相同的内容

时间:2014-11-26 10:34:20

标签: c++ binary-search-tree

这是我的代码:

#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中,搜索功能始终返回相同的值。 请帮我弄清楚错误。 上面的代码没有编译错误。 除搜索功能外的所有其他功能都正常工作。 但搜索功能无法按要求搜索元素是否在二进制搜索树中。

1 个答案:

答案 0 :(得分:0)

您的代码调用UB。

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

要解决此问题,请添加新功能:

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

同样在bst::search函数中:

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

这种情况不仅是多余的,而且还会使一些代码流路径返回而没有值。