【问题标题】:Would making a binary search tree out of a struct over a class node be bad?在类节点上从结构中创建二叉搜索树会很糟糕吗?
【发布时间】:2014-08-01 06:17:03
【问题描述】:

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

这是我的 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

【问题讨论】:

  • 标准库已经支持std::setstd::map形式的二叉树,你可以随时在算法库(lower_bound/@987654325)中使用带有二叉搜索功能的另一个容器@/binary_search).
  • 谢谢,但我只是想知道使用该结构是否可以。如果不是,为什么类 Node 会更好

标签: c++ visual-studio-2012 binary-search-tree


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    struct
    

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

    class
    

    默认情况下对其所有成员都有私有访问权限。

    你可以用他们两个实现同样的事情,但是很多程序员,包括我自己,倾向于使用 POD 对象的结构(Plain Old Data)来直接访问(这样可以更容易地少写)。

    也就是说,我认为您应该将 Node 类放在不同的文件中,因为 BST 和 Node 类非常不同。由于您为 BST 类提供了一个模板,我假设您将使用的不仅仅是 Node 类,这为您可能不使用 Node 类的项目分离文件提供了更多理由。如果您不打算只使用 Node 类,则可以考虑删除模板并在 BST 类中定义 Node 结构/类!

    【讨论】:

    • 不,我完全理解它们是如何被访问的,我只是想知道它们在使用时如何相互比较,但是你上面的回复做得很好,我喜欢它!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2022-08-02
    • 1970-01-01
    • 2016-11-06
    • 2018-03-19
    • 2019-04-11
    相关资源
    最近更新 更多