I have created a binary tree. I have a function which counts the odd values from nodes of tree.
I am always getting the output as if it is just returning the odd count from node->right.

I am loosing the value of node->left count.

``````#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

struct node
{
int data;
struct node* left;
struct node* right;
};

int getLeafCount(struct node* node, int count)
{

int temp = 0;
if(node!=NULL)
{
if((node -> data %2) != 0)
{
temp++;
count = count + temp;
}
getLeafCount(node->left, count);
getLeafCount(node->right, count);

}
return count;
}

struct node* newNode(int data)
{
struct node* node = (struct node*)malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}

int main()
{
struct node *root = newNode(1);
root->left        = newNode(2);
root->right       = newNode(3);
root->left->left  = newNode(4);
root->left->right = newNode(5);

int tot_cnt = getLeafCount(root, 0);
cout << "Total Count: " << tot_cnt;

getchar();
return 0;

}``````

I am always getting output as 1 instead of 3.
Please help me out.

Thanks

## Recommended Answers

>> if((node -> data %2) != 0)
bad coding. Make a `bool isOdd(int n){ return n % 2 == 1; }` function
and use it like so `if( isOdd(node->data) ){ ...}`

## All 3 Replies

>> if((node -> data %2) != 0)
bad coding. Make a `bool isOdd(int n){ return n % 2 == 1; }` function
and use it like so `if( isOdd(node->data) ){ ...}`

Edit: Clarification.
'When' you call getLeafCount(node->right), is the stack value of 'node' the same as when the function began at first?
Short answer: No

``````int getLeafCount(struct node* node, int count) {
int temp = 0;
if(node!=NULL) {
if((node -> data %2) != 0) {
temp++;
count = count + temp;
}
getLeafCount(node->left, count);
getLeafCount(node->right, count); // 'when' is this called?
}
return count;
}``````

The important point here is that a function is just a memory address which reads values from the stack. Even after the function continues execution (after calling getleafcount from inside itself and returning), you've moved left a node, so reading node->right won't be the node you necessarily expect (the stack has changed).

I don't think what you wrote is necessarily the functionality you want.

My problem is solved.
Thanks for the replies.

``````int getLeafCount(struct node* node, int count)
{
int temp = 0;

if(node!=NULL)
{
count = getLeafCount(node->left, temp) + getLeafCount(node->right, temp);
if((node -> data %2) != 0)
count ++;
}
return count;
}``````

Now i want to perform this using iterative method.
Any ideas or algorithms would be really appreciated.

Thanks

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.21 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.