Problem:
Provided Inorder and PostOrder of a tree. Construct the tree and print it in PreOrder traversal.
#include <stdio.h>
#include <iostream>
#include <string.h>
#include<stdlib.h>
#include <string>
using namespace std;
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;
}
}
void pintPreOrder(Node* res)
{
Node *tmp;
if(res!=NULL)
{
cout<<res->data<<" ";
if(res->left)
pintPreOrder(res->left);
if(res->right)
pintPreOrder(res->right);
}
}
Node* NewbuildTree(int in[],int post[],int in_stIndex,int in_endIndex,int *postOrderIdx)
{
if(in_stIndex>in_endIndex)
return NULL;
Node *tNode = new Node();
tNode->data=post[(*postOrderIdx)--];
tNode->left=NULL;
tNode->right=NULL;
if(in_stIndex==in_endIndex)
return tNode;
int rootIndex = search(in,in_stIndex,in_endIndex,tNode->data);
tNode->right=NewbuildTree(in,post,rootIndex+1,in_endIndex,postOrderIdx);
tNode->left=NewbuildTree(in,post,in_stIndex,rootIndex-1,postOrderIdx);
return tNode;
}
Node *buildTree(int in[], int post[], int n)
{
int postOrderIdx=n-1;
NewbuildTree(in,post,0,n-1,&postOrderIdx);
}
int main()
{
int in[105];
int post[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",&post[i]);
res=buildTree(in,post,n);
//cout<<"done"<<endl;
pintPreOrder(res);
}
return 0;
}
The problem was provided as a functional problem in Amazon & Adobe interview as here [Courtesy : geeksforgeeks]
Solution:
struct Node
{
int data;
Node *left, *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 post[],int in_stIndex,int in_endIndex,int *postOrderIdx)
{
if(in_stIndex>in_endIndex)
return NULL;
Node *tNode = new Node();
tNode->data=post[(*postOrderIdx)--];
tNode->left=NULL;
tNode->right=NULL;
if(in_stIndex==in_endIndex)
return tNode;
int rootIndex = search(in,in_stIndex,in_endIndex,tNode->data);
tNode->right=NewbuildTree(in,post,rootIndex+1,in_endIndex,postOrderIdx);
tNode->left=NewbuildTree(in,post,in_stIndex,rootIndex-1,postOrderIdx);
return tNode;
}
// Function should construct tree and return
// root of it. in[] stores inorder traversal
// post[] stores postorder traversal. n is
// size of these arrays
Node *buildTree(int in[], int post[], int n)
{
// Your code here
int postOrderIdx=n-1;
NewbuildTree(in,post,0,n-1,&postOrderIdx);
}