gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:08 25 4
gpt4 key购买 nike

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

  2
/ \
1 3

现在我尝试使用下面定义的 BS​​THeight() 计算每个节点的高度,但在计算“2”的高度时遇到了一些问题,该值应该是 1 作为“1”和“3”的高度被定义为 0。我的问题是,直接使用 '2' 的两个 child 的高度(见下面突出显示的第 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;
}
}

最佳答案

问题在于运算符优先级。加法绑定(bind)比三元运算符更强,因此您必须用方括号将三元运算符 (?:) 括起来。

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

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)

关于c++ - 关于在 C++ 中比较两个与指针相关的整数值的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com