Counting Nodes of Binary Tree

May 6, 2013 at 9:24pm
Hello,

I am trying to count every node of a binary tree internally (not passing in the root), all my attemps have ended in memory access violation or an inaccurate count (4 or 5) when it should be 10.

This is what I have tried

And yes I am NOT suppose to pass in the root.

1
2
3
4
5
6
7
8
9
10
	int CountChildren()
	{
		if ( !Left() && !Right())
			return 1;
		if ( Left() )
			return Left()->CountChildren() +1;
		if ( Right() )
			return Right()->CountChildren() +1;
	}


or

1
2
3
4
5
6
7
8
9
10
 int CountChildren() 
{

    if(!Left() && !Right())
        return 1;

     else
       return Left()->CountChildren()) + Right()->CountChildren() + 1;  
}  


Thank you
Last edited on May 6, 2013 at 9:24pm
May 6, 2013 at 9:37pm
try the following code

1
2
3
4
 int CountChildren() 
{
       return ( Left() ? Left()->CountChildren() : 0 ) + ( Right() ? Right()->CountChildren() : 0 ) + 1;  
} 
May 6, 2013 at 9:38pm
Wow, That worked. So simple, one line and you solved it. Thank you so much!

I am so use to passing in a root node that I was just stuck
May 6, 2013 at 9:44pm
I am writing your statement out as an if statement so I can understand it better, Would you mind converting it for me so I do not mess it up? I believe it reads like

if Left() then Left()->CoutChildren() else 0

+

Right()....

+ 1
May 6, 2013 at 9:48pm
It is equivalent to the following logic

1
2
3
4
5
6
int count = 1;

if ( Left() ) count += Left()->CoutChildren();
if ( Right() ) count += Right()->CoutChildren();

return count;


You described the logic correctly.
Last edited on May 6, 2013 at 9:52pm
May 6, 2013 at 9:53pm
I see, much cleaner using the ternary operators such as your initial solution. Thank you so much, this was giving me a headache, and in case you were wondering Im not lurking for HW answers, I am actually trying to learn this stuff better :)
May 6, 2013 at 10:04pm
It would be more cleaner to rewrite the function the following way

1
2
3
4
5
int CountChildren() const
{
       return ( 1 + ( Left()  ? Left()->CountChildren() : 0 )
                  + ( Right() ? Right()->CountChildren() : 0 ) );  
} 

Last edited on May 6, 2013 at 10:05pm
Topic archived. No new replies allowed.