本题乍一看难度有点高,其实真的不难,事实上也用divide & conquer的方法做出了,只是那种方法太烂了。所以用Stack
又重新写了一遍,虽然不符合Follow Up里面的最高要求,但是我觉得对于面试是足够了
- preorder的顺序是
parent
->left
->right
- 但是通过
Stack
,我们可以把顺序转化为inorder:left
->parent
->right
:即从Stack
中pop()
出来的顺序 这个顺序应该是单调递增,
- 或者说换种说法:只要能用通过rule转化成inorder,并且这个inorder是单调递增,则说明是valid的
时间复杂度:
- 空间复杂度:
代码如下 :
class Solution {
public boolean verifyPreorder(int[] preorder) {
if (preorder == null || preorder.length == 0) {
return true;
}
int min = Integer.MIN_VALUE;
for (int i = 0; i < preorder.length; ++i) {
if (preorder[i] < min) {
return false;
}
if (stack.isEmpty() || preorder[i] < preorder[i-1]) {
// left
stack.push(preorder[i]);
}
else {
// right
while (!stack.isEmpty() && stack.peek() < preorder[i]) {
// pop out all the nodes(left sibling + parent) small than new node
min = stack.pop(); // all the node should be smaller than this one
}
stack.push(preorder[i]);
}
}
return true;
}
}