Given a Binary Tree, complete the function to populate the next pointer for all nodes. The next pointer for every node should point to the Inorder successor of the node.
Note: The node having no in-order successor will be pointed to -1.
Example:
Input:
Binary Tree
Output: 3->8 8->10 10->12 12->-1 Explanation: The inorder of the above tree is : 3 8 10 12. So the next pointer of node 3 is pointing to 8 , next pointer of 8 is pointing to 10 and so on and next pointer of 12 is pointing to -1 as there is no inorder successor of 12.
Input:
Output: 3->2 2->1 1->-1 Explanation: The inorder of the above tree is: 3 2 1. So the next pointer of node 3 is pointing to 2 , next pointer of 2 is pointing to 1. And next pointer of 1 is pointing to -1 as there is no inorder successor of 1..
[Naive Approach] Storing Inorder - O(n) Time and O(n)
The intuition is to perform an inorder traversal of the binary tree because inorder naturally gives nodes in the order of their successors
Do Inorder traversal and store it in an array.
Traverse the array and connect every node with next to it in the array.
C++
#include<iostream>#include<vector>usingnamespacestd;// Node structurestructNode{intdata;Node*left;Node*right;Node*next;Node(intval){data=val;left=right=next=NULL;}};// Inorder traversal to store nodesvoidinorder(Node*root,vector<Node*>&nodes){if(root==NULL)return;inorder(root->left,nodes);nodes.push_back(root);inorder(root->right,nodes);}// Function to populate next pointersvoidpopulateNext(Node*root){vector<Node*>nodes;// Step 1: Store inorder traversalinorder(root,nodes);// Step 2: Link nodesintn=nodes.size();for(inti=0;i<n-1;i++){nodes[i]->next=nodes[i+1];}// Step 3: Last node points to NULLif(n>0)nodes[n-1]->next=NULL;}// Main functionintmain(){Node*root=newNode(10);root->left=newNode(8);root->right=newNode(12);root->left->left=newNode(3);// Populate next pointerspopulateNext(root);// Print resultif(root==NULL)return0;vector<Node*>nodes;inorder(root,nodes);for(inti=0;i<nodes.size();i++){cout<<nodes[i]->data<<"->";if(nodes[i]->next)cout<<nodes[i]->next->data<<" ";elsecout<<"-1 ";}return0;}
C
#include<stdio.h>#include<stdlib.h>// Node structurestructNode{intdata;structNode*left;structNode*right;structNode*next;};// Create new nodestructNode*newNode(intval){structNode*node=(structNode*)malloc(sizeof(structNode));node->data=val;node->left=node->right=node->next=NULL;returnnode;}// Inorder traversal to store nodesvoidinorder(structNode*root,structNode*nodes[],int*index){if(root==NULL)return;inorder(root->left,nodes,index);nodes[(*index)++]=root;inorder(root->right,nodes,index);}// Function to populate next pointersvoidpopulateNext(structNode*root){// assuming max 100 nodesstructNode*nodes[100];intindex=0;// Step 1: Store inorder traversalinorder(root,nodes,&index);// Step 2: Link nodesfor(inti=0;i<index-1;i++){nodes[i]->next=nodes[i+1];}// Step 3: Last node points to NULLif(index>0)nodes[index-1]->next=NULL;}intmain(){structNode*root=newNode(10);root->left=newNode(8);root->right=newNode(12);root->left->left=newNode(3);// Populate next pointerspopulateNext(root);// Print resultstructNode*nodes[100];intindex=0;inorder(root,nodes,&index);for(inti=0;i<index;i++){printf("%d->",nodes[i]->data);if(nodes[i]->next)printf("%d ",nodes[i]->next->data);elseprintf("-1 ");}return0;}
Java
importjava.util.*;// Node structureclassNode{intdata;Nodeleft,right,next;Node(intval){data=val;left=right=next=null;}}publicclassGfG{// Inorder traversal to store nodesstaticvoidinorder(Noderoot,List<Node>nodes){if(root==null)return;inorder(root.left,nodes);nodes.add(root);inorder(root.right,nodes);}// Function to populate next pointersstaticvoidpopulateNext(Noderoot){List<Node>nodes=newArrayList<>();// Step 1: Store inorder traversalinorder(root,nodes);// Step 2: Link nodesfor(inti=0;i<nodes.size()-1;i++){nodes.get(i).next=nodes.get(i+1);}// Step 3: Last node points to NULLif(!nodes.isEmpty())nodes.get(nodes.size()-1).next=null;}publicstaticvoidmain(String[]args){Noderoot=newNode(10);root.left=newNode(8);root.right=newNode(12);root.left.left=newNode(3);// Populate next pointerspopulateNext(root);// Print resultList<Node>nodes=newArrayList<>();inorder(root,nodes);for(inti=0;i<nodes.size();i++){System.out.print(nodes.get(i).data+"->");if(nodes.get(i).next!=null)System.out.print(nodes.get(i).next.data+" ");elseSystem.out.print("-1 ");}}}
Python
# Node StructureclassNode:def__init__(self,val):self.data=valself.left=Noneself.right=Noneself.next=None# Inorder traversal to store nodesdefinorder(root,nodes):ifrootisNone:returninorder(root.left,nodes)nodes.append(root)inorder(root.right,nodes)# Function to populate next pointersdefpopulateNext(root):nodes=[]# Step 1: Store inorder traversalinorder(root,nodes)# Link nodesforiinrange(len(nodes)-1):nodes[i].next=nodes[i+1]# Step 3: Last node points to NULLifnodes:nodes[-1].next=None# Driver codeif__name__=="__main__":root=Node(10)root.left=Node(8)root.right=Node(12)root.left.left=Node(3)# Populate next pointerspopulateNext(root)nodes=[]inorder(root,nodes)fornodeinnodes:print(f"{node.data}->",end="")ifnode.next:print(node.next.data,end=" ")else:print("-1",end=" ")print()
C#
usingSystem;usingSystem.Collections.Generic;// Node structureclassNode{publicintdata;publicNodeleft,right,next;publicNode(intval){data=val;left=right=next=null;}}classGfG{// Inorder traversal to store nodesstaticvoidinorder(Noderoot,List<Node>nodes){if(root==null)return;inorder(root.left,nodes);nodes.Add(root);inorder(root.right,nodes);}// Function to populate next pointersstaticvoidpopulateNext(Noderoot){List<Node>nodes=newList<Node>();// Step 1: Store inorder traversalinorder(root,nodes);// Step 2: Link nodesfor(inti=0;i<nodes.Count-1;i++){nodes[i].next=nodes[i+1];}// Step 3: Last node points to NULLif(nodes.Count>0)nodes[nodes.Count-1].next=null;}// Main functionstaticvoidMain(){Noderoot=newNode(10);root.left=newNode(8);root.right=newNode(12);root.left.left=newNode(3);// Populate next pointerspopulateNext(root);// Print resultList<Node>nodes=newList<Node>();inorder(root,nodes);for(inti=0;i<nodes.Count;i++){Console.Write(nodes[i].data+"->");if(nodes[i].next!=null)Console.Write(nodes[i].next.data+" ");elseConsole.Write("-1 ");}}}
JavaScript
// Node structureclassNode{constructor(val){this.data=val;this.left=null;this.right=null;this.next=null;}}// Inorder traversal to store nodesfunctioninorder(root,nodes){if(root===null)return;inorder(root.left,nodes);nodes.push(root);inorder(root.right,nodes);}// Function to populate next pointersfunctionpopulateNext(root){letnodes=[];// Step 1: Store inorder traversalinorder(root,nodes);// Step 2: Link nodesfor(leti=0;i<nodes.length-1;i++){nodes[i].next=nodes[i+1];}// Step 3: Last node points to nullif(nodes.length>0)nodes[nodes.length-1].next=null;}// Driver codeletroot=newNode(10);root.left=newNode(8);root.right=newNode(12);root.left.left=newNode(3);// Populate next pointerspopulateNext(root);// Print resultletnodes=[];inorder(root,nodes);letoutput="";for(leti=0;i<nodes.length;i++){output+=nodes[i].data+"->";if(nodes[i].next)output+=nodes[i].next.data+" ";elseoutput+="-1 ";}console.log(output);
Output
3->8 8->10 10->12 12->-1
[Expected Approach] Reverse Inorder - O(n) Time and O(1) Space
Traverse the given tree in reverse inorder traversal and keep track of previously visited node. When a node is being visited, assign a previously visited node as next.
C++
#include<iostream>usingnamespacestd;// Node structurestructNode{intdata;Node*left;Node*right;Node*next;Node(intval){data=val;left=right=next=NULL;}};// Helper function (Reverse Inorder Traversal)// Right → Root → LeftvoidpopulateNextUtil(Node*root,Node*&nextNode){if(root==NULL)return;// Step 1: Traverse right subtree firstpopulateNextUtil(root->right,nextNode);// Step 2: Set next pointerroot->next=nextNode;// Step 3: Update nextNode to current nodenextNode=root;// Step 4: Traverse left subtreepopulateNextUtil(root->left,nextNode);}// Main function to populate next pointersvoidpopulateNext(Node*root){Node*nextNode=NULL;populateNextUtil(root,nextNode);}// Driver codeintmain(){Node*root=newNode(10);root->left=newNode(8);root->right=newNode(12);root->left->left=newNode(3);// Populate next pointerspopulateNext(root);Node*curr=root;while(curr->left)curr=curr->left;while(curr!=NULL){cout<<curr->data<<"->";if(curr->next)cout<<curr->next->data<<" ";elsecout<<"-1 ";curr=curr->next;}cout<<endl;return0;}
C
#include<stdio.h>#include<stdlib.h>// Node structurestructNode{intdata;structNode*left;structNode*right;structNode*next;};// Function to create a new nodestructNode*newNode(intval){structNode*node=(structNode*)malloc(sizeof(structNode));node->data=val;node->left=node->right=node->next=NULL;returnnode;}// Helper function (Reverse Inorder Traversal)// Right → Root → LeftvoidpopulateNextUtil(structNode*root,structNode**nextNode){// Base caseif(root==NULL)return;// Step 1: Traverse right subtreepopulateNextUtil(root->right,nextNode);// Step 2: Set next pointerroot->next=*nextNode;// Step 3: Update nextNode to current node*nextNode=root;// Step 4: Traverse left subtreepopulateNextUtil(root->left,nextNode);}// Main function to populate next pointersvoidpopulateNext(structNode*root){// Initially NULLstructNode*nextNode=NULL;populateNextUtil(root,&nextNode);}// Main functionintmain(){structNode*root=newNode(10);root->left=newNode(8);root->right=newNode(12);root->left->left=newNode(3);// Populate next pointerspopulateNext(root);// Print resultstructNode*curr=root;while(curr->left)curr=curr->left;// Traverse using next pointerswhile(curr!=NULL){printf("%d->",curr->data);if(curr->next)printf("%d ",curr->next->data);elseprintf("-1 ");curr=curr->next;}return0;}
Java
// Node structureclassNode{intdata;Nodeleft,right,next;Node(intval){data=val;left=right=next=null;}}publicclassGfG{// Helper function (Reverse Inorder Traversal)staticvoidpopulateNextUtil(Noderoot,Node[]nextNode){// Base caseif(root==null)return;// Step 1: Traverse right subtreepopulateNextUtil(root.right,nextNode);// Step 2: Set next pointerroot.next=nextNode[0];// Step 3: Update nextNodenextNode[0]=root;// Step 4: Traverse left subtreepopulateNextUtil(root.left,nextNode);}// Main function to populate next pointersstaticvoidpopulateNext(Noderoot){Node[]nextNode=newNode[1];nextNode[0]=null;populateNextUtil(root,nextNode);}// Main functionpublicstaticvoidmain(String[]args){Noderoot=newNode(10);root.left=newNode(8);root.right=newNode(12);root.left.left=newNode(3);// Populate next pointerspopulateNext(root);// Print resultNodecurr=root;while(curr.left!=null)curr=curr.left;// Traverse using next pointerswhile(curr!=null){System.out.print(curr.data+"->");if(curr.next!=null)System.out.print(curr.next.data+" ");elseSystem.out.print("-1 ");curr=curr.next;}}}
Python
# Node structureclassNode:def__init__(self,val):self.data=valself.left=Noneself.right=Noneself.next=None# Helper function (Reverse Inorder Traversal)defpopulateNextUtil(root,nextNode):# Base caseifrootisNone:return# Step 1: Traverse right subtreepopulateNextUtil(root.right,nextNode)# Step 2: Set next pointerroot.next=nextNode[0]# Step 3: Update nextNodenextNode[0]=root# Step 4: Traverse left subtreepopulateNextUtil(root.left,nextNode)# Main function for populating next pointersdefpopulateNext(root):nextNode=[None]# using list as referencepopulateNextUtil(root,nextNode)# Driver Codeif__name__=="__main__":root=Node(10)root.left=Node(8)root.right=Node(12)root.left.left=Node(3)populateNext(root)curr=rootwhilecurr.left:curr=curr.leftwhilecurr:print(f"{curr.data}->",end="")ifcurr.next:print(curr.next.data,end=" ")else:print("-1",end=" ")curr=curr.nextprint()
C#
usingSystem;// Node structureclassNode{publicintdata;publicNodeleft,right,next;publicNode(intval){data=val;left=right=next=null;}}classGfG{// Helper function (Reverse Inorder Traversal)// Right -> Root -> LeftstaticvoidpopulateNextUtil(Noderoot,refNodenextNode){// Base caseif(root==null)return;// Traverse right subtreepopulateNextUtil(root.right,refnextNode);// Set next pointerroot.next=nextNode;// Update nextNodenextNode=root;// Traverse left subtreepopulateNextUtil(root.left,refnextNode);}// Main function for populating next pointersstaticvoidpopulateNext(Noderoot){NodenextNode=null;populateNextUtil(root,refnextNode);}// Print functionstaticvoidprintTree(Noderoot){if(root==null)return;printTree(root.left);Console.Write(root.data+"->");if(root.next!=null)Console.Write(root.next.data+" ");elseConsole.Write("-1");printTree(root.right);}// Main functionstaticvoidMain(){Noderoot=newNode(10);root.left=newNode(8);root.right=newNode(12);root.left.left=newNode(3);// Populate next pointerspopulateNext(root);// Print resultNodecurr=root;while(curr.left!=null)curr=curr.left;// Traverse using next pointerswhile(curr!=null){Console.Write(curr.data+"->");if(curr.next!=null)Console.Write(curr.next.data+" ");elseConsole.Write("-1 ");curr=curr.next;}}}
JavaScript
// Node structureclassNode{constructor(val){this.data=val;this.left=null;this.right=null;this.next=null;}}// Helper function (Reverse Inorder Traversal)functionpopulateNextUtil(root,nextNode){// Base caseif(root===null)return;// Step 1: Traverse right subtreepopulateNextUtil(root.right,nextNode);// Step 2: Set next pointerroot.next=nextNode.value;// Step 3: Update nextNodenextNode.value=root;// Step 4: Traverse left subtreepopulateNextUtil(root.left,nextNode);}// Main function for populating next pointersfunctionpopulateNext(root){// object to mimic referenceletnextNode={value:null};populateNextUtil(root,nextNode);}// Driver codeletroot=newNode(10);root.left=newNode(8);root.right=newNode(12);root.left.left=newNode(3);// Populating next pointerspopulateNext(root);// Print result// Find leftmost node (inorder start)letcurr=root;while(curr.left)curr=curr.left;// Traverse using next pointersletoutput="";while(curr!==null){output+=curr.data+"->";output+=curr.next?curr.next.data+" ":"-1 ";curr=curr.next;}console.log(output);