Problem:
Provided Inorder and PreOrder of a tree. Construct the tree and print it in PostOrder traversal.
#include <stdio.h>
#include <iostream>
#include <string.h>
#include<stdlib.h>
#include <string>
using namespace std;
int preOrderIdx=0;
struct Node{
int data;
Node *left;
Node *rit;
};
int search(int in[],int in_stIndex,int in_endIndex,int data)
{
for(int i=in_stIndex;i<=in_endIndex;i++)
{
if(in[i]==data)
return i;
}
}
Node* buildTree(int in[],int pre[],int in_stIndex,int in_endIndex)
{
//static int preOrderIdx=0;
if(in_stIndex>in_endIndex)
return NULL;
Node *tNode = new Node();
tNode->data=pre[preOrderIdx++];
tNode->left=NULL;
tNode->rit=NULL;
if(in_stIndex==in_endIndex)
return tNode;
int rootIndex = search(in,in_stIndex,in_endIndex,tNode->data);
tNode->left=buildTree(in,pre,in_stIndex,rootIndex-1);
tNode->rit=buildTree(in,pre,rootIndex+1,in_endIndex);
return tNode;
}
void pintPostOrder(Node* res)
{
Node *tmp;
if(res!=NULL)
{
if(res->left)
pintPostOrder(res->left);
if(res->rit)
pintPostOrder(res->rit);
cout<<res->data<<" ";
}
}
int main()
{
int in[105];
int pre[105];
int t,n;
scanf("%d",&t);
Node *res,*tmp;
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&in[i]);
for(int i=0;i<n;i++)
scanf("%d",&pre[i]);
res=buildTree(in,pre,0,n-1);
pintPostOrder(res);
}
return 0;
}
The problem was provided as a functional problem in Microsoft interview as here [Courtesy : geeksforgeeks]
Solution:
/*
Please note that it's Function problem i.e.
you need to write your solution in the form Function(s) only.
Driver Code to call/invoke your function would be added by GfG's Online Judge.*/
/*Complete the code here.
Node is as follows:
struct Node
{
int data;
Node* left;
Node* right;
};
*/
int search(int in[],int in_stIndex,int in_endIndex,int data)
{
for(int i=in_stIndex;i<=in_endIndex;i++)
{
if(in[i]==data)
return i;
}
}
Node* newbuildTree(int in[],int pre[], int inStrt, int inEnd,int *preOrderIdx)
{
if(inStrt>inEnd)
return NULL;
Node *tNode = new Node();
tNode->data=pre[(*preOrderIdx)++];
tNode->left=NULL;
tNode->right=NULL;
if(inStrt==inEnd)
return tNode;
int rootIndex = search(in,inStrt,inEnd,tNode->data);
tNode->left=newbuildTree(in,pre,inStrt,rootIndex-1,preOrderIdx);
tNode->right=newbuildTree(in,pre,rootIndex+1,inEnd,preOrderIdx);
return tNode;
}
Node* buildTree(int in[],int pre[], int inStrt, int inEnd)
{
//add code here.
int preOrderIdx=0;
newbuildTree(in,pre, inStrt,inEnd,&preOrderIdx);
}