Open In App

Print Sum and Product of all Non-Leaf nodes in Binary Tree

Improve
Improve
Like Article
Like
Save
Share
Report

Given a Binary tree. The task is to find and print the product and sum of all internal nodes (non-leaf nodes) in the tree.

In the above tree, only two nodes 1 and 2 are non-leaf nodes. 
Therefore, product of non-leaf nodes = 1 * 2 = 2. 
And sum of non-leaf nodes = 1 + 2 =3.

Examples: 

Input :
        1
      /   \
     2     3
    / \   / \
   4   5 6   7
          \
           8
Output : Product  = 36, Sum = 12
Non-leaf nodes are: 1, 2, 3, 6 

Approach: 

The idea is to traverse the tree in any fashion and check if the current node is a non-leaf node or not. Take two variables product and sum to store the product and sum of non-leaf nodes respectively. If the current node is a non-leaf node then multiply the node’s data to the variable product used to store the products of non-leaf nodes and add the node’s data to the variable sum used to store the sum of non-leaf nodes.

Algorithm:

  • Create a function called newNode that takes an integer parameter, and data, and returns a new node with null left and right pointers. It gives back the newly made node.
  •  With an integer variable named a, define the static class Int.
  • Create the function findProductSum and define its three arguments: the root node, prod, and sum, two Int objects. This function calculates the product and sum of the binary tree’s non-leaf nodes. It carries out the subsequent actions:  
                
    •  Return whether either the root node or the root node’s left and right child nodes are null.
    • Multiply the product by the node’s data, then add the node’s data to the sum if the root node has at least one non-null child.                                                                                     
    • Recursively call the findProductSum function for the left child of the root node.                                                                              
    •  Recursively call the findProductSum function for the right child of the root node.                                                                                    

Below is the implementation of the above idea: 

C++




// CPP program to find product and sum of
// non-leaf nodes in a binary tree
#include <bits/stdc++.h>
using namespace std;
 
/* A binary tree node has data, pointer to
left child and a pointer to right child */
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};
 
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct Node* newNode(int data)
{
    struct Node* node = new Node;
    node->data = data;
    node->left = node->right = NULL;
    return (node);
}
 
// Computes the product of non-leaf
// nodes in a tree
void findProductSum(struct Node* root, int& prod, int& sum)
{
    // Base cases
    if (root == NULL || (root->left == NULL
                            && root->right == NULL))
        return;
     
    // if current node is non-leaf,
    // calculate product and sum
    if (root->left != NULL || root->right != NULL)
    {
        prod *= root->data;
        sum += root->data;
    }
         
    // If root is Not NULL and its one of its
    // child is also not NULL
    findProductSum(root->left, prod, sum);
    findProductSum(root->right, prod, sum);
}
 
// Driver Code
int main()
{  
    // Binary Tree
    struct Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
     
    int prod = 1;
    int sum = 0;
     
    findProductSum(root, prod, sum);
     
    cout <<"Product = "<<prod<<" , Sum = "<<sum;
     
    return 0;
}


Java




// Java program to find product and sum of
// non-leaf nodes in a binary tree
class GFG
{
 
/* A binary tree node has data, pointer to
left child and a pointer to right child */
static class Node
{
    int data;
    Node left;
    Node right;
};
 
/* Helper function that allocates a new node with the
given data and null left and right pointers. */
static Node newNode(int data)
{
    Node node = new Node();
    node.data = data;
    node.left = node.right = null;
    return (node);
}
 
//int class
static class Int
{
    int a;
}
 
// Computes the product of non-leaf
// nodes in a tree
static void findProductSum(Node root, Int prod, Int sum)
{
    // Base cases
    if (root == null || (root.left == null
                            && root.right == null))
        return;
     
    // if current node is non-leaf,
    // calculate product and sum
    if (root.left != null || root.right != null)
    {
        prod.a *= root.data;
        sum.a += root.data;
    }
         
    // If root is Not null and its one of its
    // child is also not null
    findProductSum(root.left, prod, sum);
    findProductSum(root.right, prod, sum);
}
 
// Driver Code
public static void main(String args[])
{
    // Binary Tree
    Node root = newNode(1);
    root.left = newNode(2);
    root.right = newNode(3);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
     
    Int prod = new Int();prod.a = 1;
    Int sum = new Int(); sum.a = 0;
     
    findProductSum(root, prod, sum);
     
    System.out.print("Product = " + prod.a + " , Sum = " + sum.a);
}
}
 
// This code is contributed by Arnab Kundu


Python3




# Python3 program to find product and sum
# of non-leaf nodes in a binary tree
 
# Helper function that allocates a new
# node with the given data and None
# left and right pointers.                                
class newNode:
 
    # Construct to create a new node
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
 
# Computes the product of non-leaf
# nodes in a tree
class new:
    def findProductSum(sf,root) :
     
        # Base cases
        if (root == None or (root.left == None and
                             root.right == None)) :
            return
             
        # if current node is non-leaf,
        # calculate product and sum
        if (root.left != None or
            root.right != None) :
             
            sf.prod *= root.data
            sf.sum += root.data
             
        # If root is Not None and its one
        # of its child is also not None
        sf.findProductSum(root.left)
        sf.findProductSum(root.right)
     
    def main(sf):
        root = newNode(1)
     
        root.left = newNode(2)
        root.right = newNode(3)
        root.left.left = newNode(4)
        root.left.right = newNode(5)
     
        sf.prod = 1
        sf.sum = 0
     
        sf.findProductSum(root)
     
        print("Product =", sf.prod,
              ", Sum =", sf.sum)
     
# Driver Code
if __name__ == '__main__':
    x = new()
    x.main()
 
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)


C#




// C# program to find product and sum of
// non-leaf nodes in a binary tree
using System;
     
class GFG
{
 
/* A binary tree node has data, pointer to
left child and a pointer to right child */
public class Node
{
    public int data;
    public Node left;
    public Node right;
};
 
/* Helper function that allocates a new node with the
given data and null left and right pointers. */
static Node newNode(int data)
{
    Node node = new Node();
    node.data = data;
    node.left = node.right = null;
    return (node);
}
 
// int class
public class Int
{
    public int a;
}
 
// Computes the product of non-leaf
// nodes in a tree
static void findProductSum(Node root, Int prod, Int sum)
{
    // Base cases
    if (root == null || (root.left == null
                            && root.right == null))
        return;
     
    // if current node is non-leaf,
    // calculate product and sum
    if (root.left != null || root.right != null)
    {
        prod.a *= root.data;
        sum.a += root.data;
    }
         
    // If root is Not null and its one of its
    // child is also not null
    findProductSum(root.left, prod, sum);
    findProductSum(root.right, prod, sum);
}
 
// Driver Code
public static void Main(String []args)
{
    // Binary Tree
    Node root = newNode(1);
    root.left = newNode(2);
    root.right = newNode(3);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
     
    Int prod = new Int();prod.a = 1;
    Int sum = new Int(); sum.a = 0;
     
    findProductSum(root, prod, sum);
     
    Console.Write("Product = " + prod.a + " , Sum = " + sum.a);
}
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
 
// JavaScript program to find product and sum of
// non-leaf nodes in a binary tree
/* A binary tree node has data, pointer to
left child and a pointer to right child */
class Node {
    constructor() {
        this.data = 0;
        this.left = null;
        this.right = null;
    }
}
 
/* Helper function that allocates a new node with the
given data and null left and right pointers. */
function newNode(data)
{
    var node = new Node();
    node.data = data;
    node.left = node.right = null;
    return (node);
}
 
//var class
 class Int
{
constructor(){
    this.a = 0;
    }
}
 
// Computes the product of non-leaf
// nodes in a tree
function findProductSum(root,  prod,  sum)
{
    // Base cases
    if (root == null || (root.left == null
                            && root.right == null))
        return;
     
    // if current node is non-leaf,
    // calculate product and sum
    if (root.left != null || root.right != null)
    {
        prod.a *= root.data;
        sum.a += root.data;
    }
         
    // If root is Not null and its one of its
    // child is also not null
    findProductSum(root.left, prod, sum);
    findProductSum(root.right, prod, sum);
}
 
// Driver Code
  
    // Binary Tree
     root = newNode(1);
    root.left = newNode(2);
    root.right = newNode(3);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
     
    var prod = new Int();
    prod.a = 1;
    var sum = new Int();
    sum.a = 0;
     
    findProductSum(root, prod, sum);
     
    document.write("Product = " + prod.a + " , Sum = " + sum.a);
 
 
// This code contributed by aashish1995
 
</script>


Output

Product = 2 , Sum = 3

Complexity Analysis:

  • Time Complexity: O(N)
    • As we are visiting every node just once.
  • Auxiliary Space: O(h)
    • Here h is the height of the tree and extra space is used in recursion call stack. In the worst case(when tree is skewed) this can go upto O(N).


Last Updated : 15 Mar, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads