C++ 从类节点上的结构生成二叉搜索树是否不好?

C++ 从类节点上的结构生成二叉搜索树是否不好?,c++,visual-studio-2012,binary-search-tree,C++,Visual Studio 2012,Binary Search Tree,我不确定我是否应该。。或者不应使用结构创建二叉搜索树,另一个选项是从单独的节点类中创建节点。有数据,左,右。哪一个更好?为什么 这是我的BST代码 template <typename T> class BST : public SearchableADT<T> { public: BST(void){ head = NULL; numnodes = 0; } virtual ~BST(void); virtual int loadFromFil

我不确定我是否应该。。或者不应使用结构创建二叉搜索树,另一个选项是从单独的节点类中创建节点。有数据,左,右。哪一个更好?为什么

这是我的BST代码

template <typename T>
class BST : public SearchableADT<T>
{
public:
  BST(void){    head     = NULL; numnodes = 0; }
  virtual ~BST(void);
  virtual int loadFromFile(string filename);
  virtual void clear(void);
  virtual void insertEntry(T info); 
  virtual void deleteEntry(T info); 
  virtual bool isThere(T info);
  virtual int numEntries(void); 

  //needed for comparison to AVL 
  int BST<T>::height(t_node* tPTR); 
protected:
  struct t_node
  {
      string data;
      t_node *L;
      t_node *R;
  };
  int numnodes;
  t_node* head; 
  t_node* cPTR; //current pointer
  t_node* pPTR; //parent pointer
  t_node* tPTR; //temporary pointer  
}; // end of class BST
模板
BST类:公共可搜索ADT
{
公众:
BST(void){head=NULL;numnodes=0;}
虚~BST(void);
虚拟int loadFromFile(字符串文件名);
虚空清除(void);
虚拟空位插入(T信息);
虚拟无效删除条目(T信息);
虚拟战场(T信息);
虚拟整数(void);
//需要与AVL进行比较
int BST::高度(t_节点*tPTR);
受保护的:
结构t_节点
{
字符串数据;
t_节点*L;
t_节点*R;
};
内结节;
t_节点*头部;
t_node*cPTR;//当前指针
t_node*pPTR;//父指针
t_node*tPTR;//临时指针
}; // 结业英国夏令时

最好创建两个类,一个用于BST,另一个用于节点。它们是两种不同的抽象。节点是一种更简单的抽象,其主要目的是保存定义BST所需的数据。BST是一种更高级别的抽象。它是一个集合类,有自己的约束和期望

我不确定您是否理解struct和class之间的区别,但基本上:

struct
默认情况下对其所有成员具有公共访问权限,并且

class
默认情况下,对其所有成员具有私有访问权限

这两种方法都可以实现同样的效果,但包括我在内的许多程序员倾向于使用POD对象的结构(普通的旧数据)进行直接访问(这样更容易编写更少的数据)


也就是说,我认为应该将节点类放在不同的文件中,因为BST和节点类非常不同。由于您为BST类提供了一个模板,因此我假设您将使用的不仅仅是Node类,这就为您可能不使用Node类的项目提供了更多分离文件的理由。如果您不打算使用更多的节点类,您可以考虑删除模板并在BST类中定义节点结构/类! 标准库已经以
std::set
std::map
的形式支持二叉树,并且您可以始终在算法库中使用另一个包含二进制搜索函数的容器(
下限
/
上限
/
二进制搜索
)。谢谢,但是我只是想知道是否可以使用struct。如果不是的话,为什么类节点会更好呢?如果我不完全理解它们是如何被访问的,我只是想知道它们在使用时是如何相互比较的,但是上面的回答非常好,我很喜欢!非常感谢。