* or *
\ /
* *
Solution: The key is to understand what can uniquely denote a tree (or serialize a tree). A good way to serialize a tree is to record the pre-order traversal of a binary tree plus the nil virtual leaf information. If we denote an actual node as "1", the nil virtual leaf as "0". The sequence "10100" will stand for the following tree:
*
/ \
nil *
/ \
nil nil
The way to decide the nil leaf is to check the children of a node. If a node is a leaf in the tree, it will have two nil virtual leaves, since a leaf won't have any children. Similarly, we can know the sequence "11000" will stand for the following tree:
*
/ \
* nil
/ \
nil nil
Therefore, our target is to enumerate all possible sequences. There are several constraints on the sequences:
- For a n node tree, the length of the sequence will be 2n+1 with n "1" and n+1 "0".
- For any position i in the sequence s and i != 2n, the number of "1" should always be no smaller than the number of "0" in the sub-sequence s[0, i].
// rebuild the tree from a sequence such as "11000" TreeNode * rebuild_tree(int s[], int n) { TreeNode *root = create_node(); stack<TreeNode *> stk; stk.push(root); for(int i=1; i<s.size(); i++) { if(s[i]) { TreeNode *node = create_node(); if(s[i-1]) { stk.top()->left = node; } else { stk.top()->right = node; stk.pop(); } stk.push(node); } else { if(!s[i-1]) stk.pop(); } } return root; } //print all possible trees void output_all_possible_trees(int *seq, int n, int num1, int num0) { if((num1 + num0) == 2*n) { seq[2*n] = 0; TreeNode *root = rebuild_tree(seq, 2*n+1); print_tree(root); return; } if(num1 >= num0 && num1 < n) { seq[num1+num0] = 1; output_all_possible_trees(seq, n, num1+1, num0); } if(num0 < num1 && num1 <=n) { seq[num1+num0] = 0; output_all_possible_trees(seq, n, num1, num0+1); } }
No comments:
Post a Comment