二叉树(从文件中读取)

时间:2013-02-23 13:08:25

标签: c++

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

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

template <class T>
class BinaryTree{
  private:
       TreeNode<T> *Root;        
  public:  
       BinaryTree();
       void insertNode();
};


template <class T>
BinaryTree<T>::BinaryTree()
{
Root=NULL;                       
ifstream fin;
fin.open("names.txt");
string buffer;
T buff;
while (!fin.eof())
{
      getline(fin,buffer,'~');
      fin>>buff;
      cout<<buff<<buffer<<endl;
      cout<<"down the tree"<<endl;
      TreeNode<T> *temp=Root;
      while (temp!=NULL)
      {
          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;
          }
          cout<<"further down"<<endl;
      }
      temp->value=buffer;
      temp->key=buff;
      cout<<"and done!"<<endl;

      cout<<"hey"<<endl;
}
fin.close();
}

我正在制作二叉树。我的树中有左右子节点的指针,每个节点都有一个键和一个字符串值。在我的析构函数中,我正在读取文件并将键和值存储在节点中。该文件的每一行都具有以下格式: "M. Ubiquity~ 14100148"   - 值是键后面的名称。 每当我运行此代码时,我都会出现分段错误错误,但我似乎无法找到错误。 任何提示/帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您拥有Root=NULL;,然后排成几行TreeNode<T> *temp = Root;,因此您拥有temp=NULL

显然while (temp!=NULL)永远不会执行,而在while循环之后你有temp->value=buffer;会导致分段错误!

答案 1 :(得分:0)

指针只能与内存地址相关联,而不能与值相关联。主要有两种方法:如果你有一个自动变量,你可以将它的地址分配给这样的指针:

int  i  = 6; //automatic variable
int *pi = &i;
std::cout << pi; // you get the address of pi (hexadecimal number)
std::cout << *pi; // 6

或者您可以手动分配内存。主要的是如果你为一个变量分配了内存,你还必须解除分配它,否则你的程序就会出现“内存泄漏”。

int *pi = new int(6);
delete pi;

因此,如果在树中放置新元素,则必须为它们分配内存,如果删除元素,则必须使用delete进行破坏。你必须要关心不要打破清单。