4

我正在开发一个函数来查找二叉搜索树的高度。我找到了一种似乎应该可以工作的方法,但我一直收到此错误,我不知道它有什么问题: PA5.exe 中 0x00903417 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004。

这是我的高度函数...

template <class T>
int BST<T>::height()
{

    return displayHeight(mRootNode);    

}

template <class T>
int BST<T>::displayHeight(BST<T> *node)
{
    if (node = NULL)
    {
        return 0;
    }

    int left = displayHeight(node->mLeft);
    int right = displayHeight(node->mRight); 

    if (left > right)
        return 1 + left;
    else
        return 1 + right;
}

这是主要功能中的实现......

 cout << endl << "height: " << tree.height();

如果我应该包括其他任何内容,请告诉我。谢谢!

4

4 回答 4

7
if (node = NULL)

应该

if (node == NULL)

因为在 C++=中是赋值运算符,并且==是用于比较的关系运算符。

为什么会崩溃?

当您这样做时if (node = NULL),您将分配NULL给节点,并且由于 NULL 是0条件if失败。因此,您继续在节点的子节点上递归调用该函数。现在假设node第一次调用该函数时实际上是 NULL,您将对 NULL 的左右孩子进行递归调用!!!导致崩溃。

于 2012-10-24T02:03:19.207 回答
1

您在 if 语句中将 null 分配给您的节点参数变量。

if (node = NULL)
{
    return 0;
}

应该

if(node == NULL) ...
于 2012-10-24T02:04:23.480 回答
1

创建树时查找高度的方法(BST):对于左子树和右子树::

在创建实际树之前,将要放入二叉树的元素放入数组中。计算大于根的元素的数量,这将向树的左侧移动,右侧类似。

然后,当您将元素添加到树中时。每次将标志位设置为 1 或 0,具体取决于您是将其添加到左子树还是右子树。

if(root->right && flagleft==1)
     no_left--;
     else if(root->right && flagright==1)
         no_right--;

这是在您将节点附加到左侧时。

if(root->left && flagl==1)
nl--;
else if(root->left && flagr==1)
nr--;

这是在您将节点附加到右侧时。

于 2013-04-24T05:42:53.973 回答
0

这是因为您已将节点分配给 NULL 即 NULL 值为 0 ,因此条件失败。

做 if(node==NULL) 而不是 if(node=NULL)

于 2017-02-02T03:48:48.053 回答