1

我正在定义一个像这样的二叉搜索树类:

template <class T>
class BSTNode
{
  public:
    BSTNode(){
      right = left = 0;
    }

    BSTNode(const T& el, BSTNode * l = 0, BSTNode * r = 0)
    {
    val = el; left = l; right = r;
    }   

    T val;
    BSTNode * right;
    BSTNode * left;
};

template <class T>
class BST
{
  public:
    BST(){ root = 0;}           
    void Insert(const T& el);
  private:
    BSTNode<T> * root;
};

我实现了Insert()这样的功能:

template <class T>
void BST<T>::Insert(const T& el)
{
  bool bEqual = false;
  BSTNode<T> * p = root;

  while(p)
  {
    if(el == p->val)
    {
      bEqual = true;
      return;
    }
    if(el < p->val)
    {
      // go left
      p = p->left;
    }
    if(el > p->val)
    {
      // go right
      p = p->right;
    }
  }

  if(!p)
  {
    std::cout << "creating new node " << el << "\n";
    p = new BSTNode<T>(el);
  }  
}

为什么root指针变量保持在0,而不是新对象的地址?

4

2 回答 2

2

你永远不会root = ?;在你的代码中这样做;此外,p = new BSTNode<T>(el);泄漏内存。

我的猜测是您想p成为对指针的引用,因此您可以更改原始指针。

 BSTNode<T> *& p = root; // watch out, it won't solve anything

但是,在这种情况下,p是不可重新分配的。您可能想检查您分配给的指针是否p为空,只需将新值插入正确的位置(例如。p->left = new BSTNode<T>(el);)并p仅在给定指针不为空时重新分配。

我是说:

template <class T>
void BST<T>::Insert(const T& el)
{
  bool bEqual = false;
  BSTNode<T> * p = root;

  if (p == 0)
  {
     root = new BSTNode<T>(el);
     return;
  }

  while(true)
  {
    if(el == p->val)
    {
      bEqual = true;
      return;
    }
    if(el < p->val)
    {
      if (p->left == 0)
      {
        p->left = new BSTNode<T>(el);
        return;
      }
      p = p->left;
    }
    if(el > p->val)
    {
      if (p->right == 0)
      {
        p->right = new BSTNode<T>(el);
        return;
      }
      p = p->right;
    }
  }
} 
于 2012-04-14T16:44:15.537 回答
1

因为在构建对象时

该声明

  p= root

将 p 初始化为空指针..

您创建一个新对象并将其地址传递给 p 而不是 root ...

问题是 p 只是 root 的副本,而不是对该指针的引用。

于 2012-04-14T16:46:17.150 回答