如何确定二进制搜索树是否包含用户给出的节点

时间:2014-06-23 08:13:10

标签: c++ binary-search-tree

我想创建一个bool方法 bool search(int),以确定BST(二进制搜索树)是否包含用户给出的节点。

我知道这个算法:
我们首先将用户给出的数字与BST根的数量进行比较。有三种可能性:
1.given number等于root - 搜索成功结束,方法返回true 2.given数字大于根 - 然后我们继续递归右侧后代(右子树)
3.given数小于根 - 然后我们继续递归左后代(左子树)

我知道这个问题的概念以及它应该如何工作但我仍然无法编写真正有效的代码。你能帮我解决一下吗?

这是我的代码(它不起作用,但我认为这个概念是正确的):

#include <process.h>
#include <conio.h>
#include <iostream>
#include <cstdlib>
using namespace std;

class BinarySearchTree
{
    private:
        struct tree_node
        {
           tree_node* left;
           tree_node* right;
           int data;
        };
        tree_node* root;
    public:
        BinarySearchTree()
        {
           root = NULL;
        }
        void insert(int);
        bool isEmpty() const { return root==NULL; }
        bool search(int);

};

//----------------------------------------------------------
void BinarySearchTree::insert(int d)
{
    tree_node* t = new tree_node;
    tree_node* parent;
    t->data = d;
    t->left = NULL;
    t->right = NULL;
    parent = NULL;
  // is this a new tree?
  if(isEmpty()) root = t;
  else
  {
    //Note: ALL insertions are as leaf nodes
    tree_node* curr;
    curr = root;
    // Find the Node's parent
    while(curr)
    {
        parent = curr;
        if(t->data > curr->data) curr = curr->right;
        else curr = curr->left;
    }
    if(t->data < parent->data)
       parent->left = t;
    else
       parent->right = t;
  }


}
bool BinarySearchTree::search(int d)
{
    if (d ==  tree_node* root)
        return true;
    else if (d >  tree_node* root)
    {
        if (this->right != NULL)    // case it has right descendant
            this->right->search(d);
        else
            return false;
    }
    else
    {
        if (this->left != NULL)     // case it has left descendant
            this->left->search(d);
        else
            return false;
    }
}

//----------------------------------------------------------
int main()
{
    BinarySearchTree b;
    int ch,tmp,tmp1;
    while(1)
    {
       cout<<endl<<endl;
       cout<<" Binary Search Tree Operations "<<endl;
       cout<<" ----------------------------- "<<endl;
       cout<<" 1. Insertion/Creation "<<endl;
       cout<<" 2. Does BST contain this number? "<<endl;
       cout<<" 3. Exit "<<endl;
       cout<<" Enter your choice : ";
       cin>>ch;
       switch(ch)
       {
           case 1 : cout<<" Enter Number to be inserted : ";
                    cin>>tmp;
                    b.insert(tmp);
                    break;
           case 2 : cout<<" Enter number to be found : ";
                    cin>>tmp1;
                    b.search(tmp1);
                    break;
           case 3 : system("pause");
                    return 0;
                    break;
       }
    }
}

2 个答案:

答案 0 :(得分:2)

你可以通过使用while循环来做到这一点。只需遍历适当的节点。如果找到值,则返回true,否则如果temp节点变为NULL并且未找到值,则循环终止并返回false。

bool BinarySearchTree::search(int d) {
    tree_node* temp = root;
    while (temp != NULL) {
        if (temp->data == d) {
            return true;
        }
        else {
            if (d > temp->data) {
                temp = temp->right;
            }
            else {
                temp = temp->left;
            }
        }
    }
    return false;
}


使用这行代码:this->right->search(d);,您可以从search结构中调用一个名为right的函数。 right的类型为tree_node,因此其中没有函数search,因此出现错误。我想你试图从你的班级对search进行一些递归调用。

答案 1 :(得分:1)

if (d ==  tree_node* root)

应改为

if (d == root->data)