本题乍一看难度有点高,其实真的不难,事实上也用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]) {// leftstack.push(preorder[i]);}else {// rightwhile (!stack.isEmpty() && stack.peek() < preorder[i]) {// pop out all the nodes(left sibling + parent) small than new nodemin = stack.pop(); // all the node should be smaller than this one}stack.push(preorder[i]);}}return true;}}
