3つの要素{1、2、3}のBSTがあります。その構造は次のようになります
2
/ \
1 3
次に、以下に定義するBSTHeight()を使用して各ノードの高さを計算しようとしましたが、「2」の高さの計算に問題があります。「1」と「3」の高さは次のように定義されているため、この値は1であると想定されます。 0.私の問題は、「2」の2つの子の高さを直接使用する場合(以下で強調表示されているパート2を参照)、その高さは常に0であるということです。ただし、2つの一時整数変数を使用する場合、その値は正しいです(以下で強調表示されているパート1を参照)。機能面では、2つのアプローチの違いはわかりませんでした。誰かが理由を説明するのを手伝ってもらえますか?
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;
}
}