关于在C ++中比较两个与指针相关的整数值的意外结果

时间:2013-01-22 20:24:05

标签: c++ pointers

我有三个元素的BST {1,2,3}。它的结构看起来像

  2
 / \
1   3

现在我尝试使用下面定义的BSTHeight()来计算每个节点的高度,并且在计算“2”的高度时遇到一些问题,该值应该是1,作为“1”和“3”的高度被定义为0.我的问题是直接使用来自'2的两个孩子的高度(见下面第2部分突出显示),其高度始终为0 。但是,如果我使用两个临时整数变量,它的值是正确的(参见下面突出显示的第1部分)。在功能方面,我看不出这两种方法有什么区别。任何人都可以帮忙解释原因吗?

void BSTHeight(bst_node *p_node)
{
    if (!p_node) 
        return;

    if (!p_node->p_lchild && !p_node->p_rchild) {
        p_node->height = 0;
    } else if (p_node->p_lchild && p_node->p_rchild) {
        BSTHeight(p_node->p_lchild);
        BSTHeight(p_node->p_rchild);
#if 0   // part 1
        int lchild_height = p_node->p_lchild->height;
        int rchild_height = p_node->p_rchild->height;
        p_node->height = 1 + ((lchild_height > rchild_height) ? lchild_height : rchild_height);
#else   // part 2
        p_node->height = 1 + ((p_node->p_lchild->height) > (p_node->p_rchild->height)) ? (p_node->p_lchild->height) : (p_node->p_rchild->height);
#endif
    } else if (!p_node->p_lchild) {
        BSTHeight(p_node->p_rchild);
        p_node->height = 1 + p_node->p_rchild->height;
    } else {
        BSTHeight(p_node->p_lchild);
        p_node->height = 1 + p_node->p_lchild->height;
    }
}

1 个答案:

答案 0 :(得分:1)

问题在于运营商优先级。加法比三元运算符更强,因此必须用括号括起三元运算符(?:)。

以下是更正后的版本。请注意,您使用的所有括号都是超级的,我已将其删除。我已经添加了唯一需要的对:

1 + (p_node->p_lchild->height > p_node->p_rchild->height ?
     p_node->p_lchild->height : p_node->p_rchild->height);

更好的方法是使用std::max(来自<algorithm>):

1 + std::max(p_node->p_lchild->height, p_node->p_rchild->height)