This problem was asked by Google.

Given the sequence of keys visited by a postorder traversal of a binary search tree, reconstruct the tree.

For example, given the sequence 2, 4, 3, 8, 7, 5, you should construct the following tree:

    5
   / \
  3   7
 / \   \
2   4   8

My Solution(C++):


#include <iostream>
#include <vector>
#include <algorithm>

struct node{
  // binary tree node data structure
  int data;
  node *left;
  node *right;
};

node *createNode(int data){
  // get a node pointer with given int
  node *temp = new node;
  temp->data = data;
  temp->left = temp->right = nullptr;
  return temp;
}

int getDepth(node *root){
  // get the depth of a tree
  if (root==nullptr){
    return 0;
  }
  return 1 + std::max(getDepth(root->left), getDepth(root->right));
}

void getAllKeysOfLevel(node *root, int level, std::vector<int> &v){
  // appends keys of given level in passed vector. This is possible because
  // we are passing the vector by reference
  if (level==0 && root!=nullptr){
    v.push_back(root->data);
  }
  if (level>0){
    getAllKeysOfLevel(root->left, level-1, v);
    getAllKeysOfLevel(root->right, level-1, v);
  }
}

void printTreeLevelWise(node *root){
  // prints a tree level-wise
  int depth = getDepth(root);
  for (int i=0; i<depth; i++){
    std::vector<int> v;
    getAllKeysOfLevel(root, i, v);
    for (int j=0; j<v.size(); j++) std::cout<<v[j]<<' '; std::cout<<'\n';
  }
}

void testPrintTree(){
  // test the function printTreeLevelWise
  node *root = createNode(5);
  root->left = createNode(3);
  root->right = createNode(7);
  root->left->left  = createNode(2);
  root->left->right = createNode(4);
  root->right->right = createNode(8);
  printTreeLevelWise(root);
}

node *recoverBST(std::vector<int> postorder){
  // recovers a BST from a vector containing post-order traversal
  if (postorder.size()==0){
    return nullptr;
  }
  int top = postorder.back();
  postorder.pop_back();
  node *root = createNode(top);
  std::vector<int> left, right;
  for (int num: postorder){
    if (num<=top) left.push_back(num);
    else right.push_back(num);
  }
  root->left = recoverBST(left);
  root->right = recoverBST(right);
  return root;
}

void testRecoverBST(){
  // test the function recoverBST
  std::vector<int> v = {2, 4, 3, 8, 7, 5};
  node *root = recoverBST(v);
  printTreeLevelWise(root);
}

int main(){
  // run everything
  std::cout << "test PrintTree" << '\n';
  testPrintTree();
  std::cout << "test RecoverBST" << '\n';
  testRecoverBST();
  return 0;
}