OK, I solved ACM problem 1136 from USU's site(solution submitted and accepted). Here goes:
A postorder indeed uniquely defines a BST. I'm almost 100% sure - I have a totally deterministic algorithm (no choice whatsoever) that builds a BST from its postorder, but I can't prove the uniqueness formally. Never mind...
The algorithm goes as follows:
* vec: global stack of postorder numbers
* node is a BST node, contains a number,
and left & right pointers
* a window is a pair of numbers (L, R)
build_node (node, window)
if vec is empty
return END
next = next number on stack
if next is in the window
pop the vec stack by 1
new_node = new node(next)
if next > node->num
node-&g;tright = new_node
new_window = (node->num, window->R)
eles
node->left = new_node
new_window = (window->L, node->num)
status = build_node(new_node, new_window)
if status = END
return END
else if status = NOT_IN_LIMIT
return build_node(node, window)
else
return NOT_IN_LIMIT
return OK
The idea is simple: in postorder, the last element is the root. The one before last is its son. Which son ? Depending on ordering. If it's larger than the root, right son, otherwise left son. And so we can descend recursively deep into the tree. But what happens once, say, the right line ends and the left descendant of the root appears ? We should backtrack back to the root and take left. So, "window" is used for this purpose. At each point we keep track of what values are legal. If a value out of the window is met, we backtrack.
I implemented it in C++, using deque