Sum of the mirror image nodes of a complete binary tree in an inorder way - GeeksforGeeks

05 Aug, 2021
Given a complete binary tree, the task is to find the sum of mirror image nodes in an inorder way i.e. find the inorder traversal of the left sub-tree and for every node traversed, add the value of its mirror node to the current node’s value.
Examples: 
Input:  
Output: 20 51 19 10 Inorder traversal of the left sub-tree of the given tree is 4 23 11 5. Adding the mirror nodes, 4 + 16 = 20 23 + 28 = 51 11 + 8 = 19 5 + 5 = 10  
Approach: We will use 2 pointers to maintain 2 nodes which are the mirror image of each other. So let’s take root1 and root2 are 2 mirror image nodes. Now left child of root1 and right child of root2 will be the mirror image of each other. We will pass these two nodes (root1->left and root2->right) for next recursive call. Since we have to traverse in an inorder manner so once left sub-tree is traversed then we print the current root data and then we traverse the right sub-tree. Similarly for the right sub-tree so right child of root1 and left child of root2 will be the mirror image of each other. We will pass these two nodes (root1->right and root2->left) for next recursive call.
Below is the implementation of the above approach 
C++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include <iostream>using namespace std;typedef struct node {     // struct to store data and links to    // its left and right child    int data;    struct node* l;    struct node* r;    node(int d)    {         // Initialize data for the current node        // with the passed value as d        data = d;         // Initialize left child to NULL        l = NULL;         // Initialize right child to NULL        r = NULL;    }} Node; // Function to print the required inorder traversalvoid printInorder(Node* rootL, Node* rootR){    // We are using 2 pointers for the nodes    // which are mirror image of each other    // If both child are NULL return    if (rootL->l == NULL && rootR->r == NULL)        return;     // Since inorder traversal is required    // First left, then root and then right    printInorder(rootL->l, rootR->r);    cout << rootL->l->data + rootR->r->data << endl;    printInorder(rootL->r, rootR->l);} // Driver codeint main(){    Node* root = new Node(5);    root->l = new Node(23);    root->r = new Node(28);    root->l->l = new Node(4);    root->l->r = new Node(11);    root->r->l = new Node(8);    root->r->r = new Node(16);     printInorder(root, root);     // Since root is mirror image of itself    if (root)        cout << root->data * 2 << endl;     return 0;}
// Java implementation of the approachimport java.util.*; class GFG{    static class Node    {         // struct to store data and links to        // its left and right child        int data;        Node l;        Node r;        Node(int d)        {                 // Initialize data for the current Node            // with the passed value as d            data = d;                 // Initialize left child to null            l = null;                 // Initialize right child to null            r = null;        }    }     // Function to print the required inorder traversal    static void printInorder(Node rootL, Node rootR)    {        // We are using 2 pointers for the Nodes        // which are mirror image of each other        // If both child are null return        if (rootL.l == null && rootR.r == null)            return;             // Since inorder traversal is required        // First left, then root and then right        printInorder(rootL.l, rootR.r);        System.out.println(rootL.l.data + rootR.r.data );        printInorder(rootL.r, rootR.l);    }     // Driver code    public static void main(String args[])    {        Node root = new Node(5);        root.l = new Node(23);        root.r = new Node(28);        root.l.l = new Node(4);        root.l.r = new Node(11);        root.r.l = new Node(8);        root.r.r = new Node(16);             printInorder(root, root);             // Since root is mirror image of itself        if (root != null)            System.out.println(root.data * 2 );         }} // This code is contributed by Arnab Kundu
# Python3 implementation of the approach class Node:         def __init__(self, d):        self.data = d        self.l = None        self.r = None # Function to print the required inorder traversaldef printInorder(rootL, rootR):      # We are using 2 pointers for the nodes    # which are mirror image of each other    # If both child are None return    if rootL.l == None and rootR.r == None:        return     # Since inorder traversal is required    # First left, then root and then right    printInorder(rootL.l, rootR.r)    print(rootL.l.data + rootR.r.data)    printInorder(rootL.r, rootR.l)  # Driver codeif __name__ == "__main__":      root = Node(5)    root.l = Node(23)    root.r = Node(28)    root.l.l = Node(4)    root.l.r = Node(11)    root.r.l = Node(8)    root.r.r = Node(16)     printInorder(root, root)     # Since root is mirror image of itself    if root:        print(root.data * 2) # This code is contributed by Rituraj Jain
// C# implementation of the approachusing System; class GFG{    public class Node    {         // struct to store data and links to        // its left and right child        public int data;        public Node l;        public Node r;        public Node(int d)        {                 // Initialize data for the current Node            // with the passed value as d            data = d;                 // Initialize left child to null            l = null;                 // Initialize right child to null            r = null;        }    }     // Function to print the required inorder traversal    static void printInorder(Node rootL, Node rootR)    {        // We are using 2 pointers for the Nodes        // which are mirror image of each other        // If both child are null return        if (rootL.l == null && rootR.r == null)            return;             // Since inorder traversal is required        // First left, then root and then right        printInorder(rootL.l, rootR.r);        Console.WriteLine(rootL.l.data + rootR.r.data );        printInorder(rootL.r, rootR.l);    }     // Driver code    public static void Main(String []args)    {        Node root = new Node(5);        root.l = new Node(23);        root.r = new Node(28);        root.l.l = new Node(4);        root.l.r = new Node(11);        root.r.l = new Node(8);        root.r.r = new Node(16);             printInorder(root, root);             // Since root is mirror image of itself        if (root != null)            Console.WriteLine(root.data * 2 );         }} // This code is contributed by Arnab Kundu
<script> // Javascript implementation of the approachclass Node{    constructor(d)    {        this.l = null;        this.r = null;        this.data = d;    }} // Function to print the required inorder traversalfunction printInorder(rootL, rootR){         // We are using 2 pointers for the Nodes    // which are mirror image of each other    // If both child are null return    if (rootL.l == null && rootR.r == null)        return;       // Since inorder traversal is required    // First left, then root and then right    printInorder(rootL.l, rootR.r);    document.write(rootL.l.data +                   rootR.r.data + "</br>");    printInorder(rootL.r, rootR.l);} // Driver codelet root = new Node(5);root.l = new Node(23);root.r = new Node(28);root.l.l = new Node(4);root.l.r = new Node(11);root.r.l = new Node(8);root.r.r = new Node(16); printInorder(root, root); // Since root is mirror image of itselfif (root != null)    document.write(root.data * 2 ); // This code is contributed by suresh07 </script>
20
51
19
10
 
Time Complexity: O(N)Auxiliary Space: O(N) 
rituraj_jain
ManasChhabra2
andrew1234
suresh07
pankajsharmagfg
Binary Tree
Inorder Traversal
Data Structures
Recursion
Tree
Data Structures
Recursion
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Introduction to Tree Data Structure
Program to implement Singly Linked List in C++ using class
TCS NQT Coding Sheet
Hash Functions and list/types of Hash functions
Building an undirected graph and finding shortest path using Dictionaries in Python
Write a program to print all permutations of a given string
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Recursion
Program for Tower of Hanoi
Program for Sum of the digits of a given number