Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Reconstruction of a Tree

Write a program which reads two sequences of nodes obtained by the preorder tree walk and the inorder tree walk on a binary tree respectively, and prints a sequence of the nodes obtained by the postorder tree walk on the binary tree.

Input

In the first line, an integer $n$, which is the number of nodes in the binary tree, is given.

In the second line, the sequence of node IDs obtained by the preorder tree walk is given separated by space characters.

In the second line, the sequence of node IDs obtained by the inorder tree walk is given separated by space characters.

Every node has a unique ID from $1$ to $n$. Note that the root does not always correspond to $1$.

Output

Print the sequence of node IDs obtained by the postorder tree walk in a line. Put a single space character between adjacent IDs.

Constraints

$1 \leq n \leq 40$

Sample Input 1

5
1 2 3 4 5
3 2 4 1 5

Sample Output 1

3 4 2 5 1

Sample Input 2

4
1 2 3 4
1 2 3 4

Sample Output 2

4 3 2 1

Solution in Ruby (judge verdict: Accepted)

#binary_tree_restore
class Node
  attr_accessor :myname,:parent,:left,:right

  def initialize(n)
    @myname = n
    @parent = nil
    @left   = nil
    @right  = nil
  end

  def add_left(child)
      self.left    = child
      child.parent = self
  end

  def add_right(child)
      self.right    = child
      child.parent = self
  end

  def postorder(flag)
    if(left != nil && left != -1)
      left.postorder(0)
    end
    if(right!= nil && left != -1)
      right.postorder(0)
    end
    printf("%d",self.myname)
    printf(" ") if flag == 0
  end

end


n = STDIN.gets.split[0].to_i
$tree=Array.new(n+1){|i| Node.new(i)}
$pre =Array.new(n)
$in_ =Array.new(n)


s = STDIN.gets.split
0.upto(n-1){|i|
  $pre[i] = s[i].to_i
}

s = STDIN.gets.split
0.upto(n-1){|i|
  $in_[i]  = s[i].to_i
}

$pre_cnt=0
def get_pre_order
  ret=$pre[$pre_cnt]
  $pre_cnt += 1
  ret
end

def make_tree(array)
  root = get_pre_order

=begin
  printf("root=%d|",root)
  for n in array
    printf("%d ",n)
  end
  printf("[%d]\n",array.length)
=end

  if(array.length == 1)
    $tree[root].left = -1
    $tree[root].right= -1
  else
    pos=array.index(root)
    if(pos==0)
      $tree[root].left = nil
    else
      left_node = make_tree(array[0...pos])
      left_node.parent = $tree[root]
      $tree[root].left = left_node
    end
    if(pos == array.length-1)
      $tree[root].right= nil
    else
      right_node = make_tree(array[pos+1...$tree.length])
      right_node.parent = $tree[root]
      $tree[root].right  = right_node
    end
  end
  $tree[root]
end

make_tree($in_)
$tree[$pre[0]].postorder(1)
printf("\n")