cy77
cy77

Reputation: 55

Unexpected result regarding comparing two pointer-related integer values in C++

I have a BST of three elements {1, 2, 3}. Its structure looks like

  2
 / \
1   3

Now I try to calculate the height for each node using BSTHeight() defined below and have some problem with calculating the height of '2', which value is supposed to be 1 as the heights of '1' and '3' are defined as 0. My problem is that with direct use of heights from '2's two children (see part 2 highlighted below), its height is ALWAYS 0. However, its value is correct if I use two temporary integer variables (see part 1 highlighted below). I couldn't see any difference between the two approaches in terms of functionality. Can anyone help explain why?

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;
    }
}

Upvotes: 1

Views: 108

Answers (1)

rburny
rburny

Reputation: 1569

Problem lies in operator precedence. Addition binds stronger than ternary operator, hence you must surround ternary operator (?:) with brackets.

Below is the corrected version. Note that all brackets you used were superflous and I've removed them. I've added the only needed pair instead:

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

Even better would be to use std::max (from <algorithm>) instead:

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

Upvotes: 1

Related Questions