[LintCode] Max Tree
Max Tree
Given an integer array with no duplicates. A max tree building on this array is defined as follow:
- The root is the maximum number in the array
- The left subtree and right subtree are the max trees of the subarray divided by the root number.
Construct the max tree by the given array.
Example
Given [2, 5, 6, 0, 3, 1]
, the max tree constructed by this array is:
6
/ \
5 3
/ / \
2 0 1
Challenge
O(n) time and memory.
单调栈,每遍历到一个元素,将栈中小于该元素的结点合并,将合并后新的结点挂在当前结点的左侧。合并的时候,因为栈中的结点的值是递减的,所以直接将第二个结点挂下第一个结点的右侧。另外,这种树有个学名叫做笛卡树(Cartesian tree)。
1 /** 2 * Definition of TreeNode: 3 * class TreeNode { 4 * public: 5 * int val; 6 * TreeNode *left, *right; 7 * TreeNode(int val) { 8 * this->val = val; 9 * this->left = this->right = NULL; 10 * } 11 * } 12 */ 13 class Solution { 14 public: 15 /** 16 * @param A: Given an integer array with no duplicates. 17 * @return: The root of max tree. 18 */ 19 TreeNode* maxTree(vector<int> A) { 20 // write your code here 21 TreeNode *a, *b, *tmp; 22 stack<TreeNode*> stk; 23 int cur_max = INT_MIN; 24 for (int i = 0; i <= A.size(); ++i) { 25 if (i < A.size() && A[i] < cur_max) { 26 tmp = new TreeNode(A[i]); 27 stk.push(tmp); 28 } else { 29 b = NULL; 30 while (!stk.empty() && (i == A.size() || stk.top()->val < A[i])) { 31 b = stk.top(); stk.pop(); 32 if (!stk.empty()) a = stk.top()->right = b; 33 } 34 if (i < A.size()) { 35 tmp = new TreeNode(A[i]); 36 tmp->left = b; 37 stk.push(tmp); 38 } else { 39 stk.push(b); 40 } 41 } 42 } 43 return stk.top(); 44 } 45 };