递归删除二叉树中的每个节点

时间:2015-08-30 12:11:12

标签: c++ recursion binary-search-tree

以下是我的代码,以递归方式删除二进制搜索树中的每个节点:

template <class T>
bool BST<T>::clear()
{
    if(root == NULL)
    {
        cout << "Empty" << endl;
        return false;
    }
    else
    {
        clearNodes(root);
        return true;
    }

}

template <class T>
void BST<T>::clearNodes(BTNode<T> *cur)
{
    if(cur == NULL)
    {
        return;
    }

    clearNodes(cur->left);
    clearNodes(cur->right);

    delete cur;
}

在我的main函数中,当我尝试打印内容以检查节点是否在运行clear函数后被删除时,不知何故我在这里遇到了奇怪的显示: Image

我可以知道我的节点实际上是通过上面的清除功能删除的吗?

感谢您的导游!

2 个答案:

答案 0 :(得分:2)

我假设“检查节点是否被删除”相当于clear()打印为空。您的算法缺少重置已删除节点的步骤。

修改后的版本是

template <class T>
void BST<T>::clearNodes(BTNode<T>* &cur) //reference on pointer
{
  if (cur==NULL)
  {
    return;
  }

  clearNodes(cur->left);
  clearNodes(cur->right);

delete cur;
cur = NULL; //neccessary
}

编辑:有关更改的说明 一旦您观察到节点未设置为null的问题,第一次迭代将是在每次调用后设置有问题的节点,即

clearNodes(cur->right);
cur->right = NULL;

这会给调用者以及潜在的缺陷负责,因为调用者迟早会忘记设置为null或者可能设置错误的值。因此,您希望在clearNodes中进行设置。为了修改函数内部的指针,您需要传递指向它的指针或引用。在c ++中,我更喜欢传递引用。因此签名成为了

void BST<T>::clearNodes(BTNode<T>* &cur);

答案 1 :(得分:0)

我猜这棵树的根没有设置为Null,因此它保存了垃圾,而print函数正在迭代一个随机垃圾树。 确保在clear方法结束时为树根设置NULL。

template <class T>
bool BST<T>::clear()
{ 
   if (root==NULL)
  {
    cout << "Empty" << endl;
    return false;
  }

  else
  {
    clearNodes(root);
    root = NULL;
    return true;
  }     

}

我假设你打印时 - 检查树根是否为空,以确定树是否为空。