二叉搜索树

时间:2013-02-25 13:31:51

标签: c++

 template <class T>
void BinaryTree<T>::LoadTree(const char *file)
{
ifstream fin;
fin.open(file);
string buffer;
T buff;
while (!fin.eof())
{
      getline(fin,buffer,'~');
      fin>>buff;

      TreeNode<T> *temp,*temp1;
      temp=Root;
      temp1=temp;
      while (temp!=NULL)
      {
          temp1=temp;  
          TreeNode<T> *Right=temp->RightChild;
          TreeNode<T> *Left=temp->LeftChild;
          if (temp->key>buff)
          {
              temp=temp->LeftChild;
          }
          else if (temp->key<buff)
          {
              temp=temp->RightChild;
          }
      }
      temp=new TreeNode<T>(buff,buffer);          
      if (temp!=Root)
      temp->Parent=temp1;
}
fin.close();
}

我正在创建一个二进制搜索树。这是我的一段代码,我输入的文件包含一个名称和一个像“Alex~231423”这样的密钥。我的代码是正确的BST,因为当我运行它有一个msg,上面写着“这个应用程序已经请求Runtime以一种不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”我真的不明白什么是错的。我将不胜感激任何帮助 ** *上一个问题已解决,但msg出现在insertNode函数中,如下所示:

template <class T>
void BinaryTree<T>::insertNode(T Key,string Val)
{

 TreeNode<T> *temp,*temp1;
 temp=Root;
 while (temp!=NULL)
 {
       temp1=temp;
       if (temp->key>Key)
       {
           temp=temp->LeftChild;
       }
       else if (temp->key<Key)
       {
            temp=temp->RightChild;
       }
 }
 temp=new TreeNode<T>(Key,Val);              
 temp->Parent=temp1;
}

这是TreeNode部分

template <class T>
struct TreeNode{
  string value;
  T key;
  TreeNode<T> *Parent;
  TreeNode<T> *LeftChild;
  TreeNode<T> *RightChild;
  TreeNode (T k,string Val)
  {
           this->value=Val;
           this->key=k;
           this->Parent=NULL;
           this->LeftChild=NULL;
           this->RightChild=NULL;
  }
};

Actually I was getting the error for search function,not insert function.I am sorry for inconvenience.here is the code

template <class T>
string BinaryTree<T>::searchNode(T Key)
{        
TreeNode<T> *temp=Root;
while (temp!=NULL)
{
      if (temp->key==Key)
      {
          return temp->value;
      }
      if (temp->key>Key)
      {
          temp=temp->LeftChild;
      }
      else if (temp->key<Key)
      {
           temp=temp->RightChild;
      }                  
}     
return NULL;
}

4 个答案:

答案 0 :(得分:1)

不确定这是否是 问题,但需要指向指针的指针,否则您只需修改本地变量,而不是左/右子成员。

 TreeNode<T> **temp = &Root,
             *temp1 = NULL; // otherwise Root will have an invalid parent pointer
 while (*temp != NULL)
 {
       temp1 = *temp;
       if (temp1->key > Key)
       {
           temp = &(*temp)->LeftChild;
       }
       else if (temp1->key < Key)
       {
           temp = &(*temp)->RightChild;
       }
 }
 *temp = new TreeNode<T>(Key,Val);              
 (*temp)->Parent = temp1;

答案 1 :(得分:0)

IMO,你忘记了插入等式条件:

  if (temp->key > key)
  {
      temp=temp->LeftChild;
  }
  else if (temp->key < key)
  {
      temp=temp->RightChild;
  }
  else // if (temp->key == key)
  {
     // Do something (e.g break loop)
  }

答案 2 :(得分:0)

您需要进行更多初始化(Root和子):

template <class T>
void BinaryTree<T>::LoadTree(const char *file)
{
   ifstream fin(file);
   string buffer;
   T buff;
  while (getline(fin,buffer,'~') && fin>>buff )
  {
     TreeNode<T> *temp,*temp1;
     temp=Root;
     temp1=temp;
     while (temp!=NULL)
     {
       temp1=temp;  
       TreeNode<T> *Right=temp->RightChild;
       TreeNode<T> *Left =temp->LeftChild;
       if      (temp->key >= buff)      {   temp=temp->LeftChild;      }
       else if (temp->key <  buff)      {   temp=temp->RightChild;     }
     } // allow duplicate key??

     temp=new TreeNode<T>(buff,buffer); 
     if (     !Root)   {  Root=temp;  continue;      }
     //else if (temp !=Root)     temp->Parent=temp1;

     // insert the new node in the correct branch, that was NULL
     if (temp1->key >= buff)
      {
          temp1->LeftChild=temp;
      }
     else temp1->RightChild=temp;
  }
fin.close();
}

另外,失败时,你的searchNode必须返回“”??但不是NULL。

答案 3 :(得分:0)

您写这个的方式意味着您只能从文件创建它。写operator>>以使用istream。它也会使测试更容易:

template <class T>
class BinaryTree {
public:
    istream& operator>>(istream& is) {
        //...
        return is;
    }
};

int main() {
    stringstream ss("tree formatted data");

    BinaryTree<int> tree;
    ss >> tree;
    return 0;
}

"tree formatted data"替换为您的数据。