from leetcode https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/ java
好比序列 2, 1, 3 是以下圖的BST的preorder 序列:code
可是2, 3, 1就不會是一個preorder序列;遞歸
先複習一下BST,給定一個節點,其左子樹的全部節點都小於該節點,右子樹的全部節點都大於該節點;preorder序列是指在遍歷該BST的時候,先記錄根節點,再遍歷左子樹,而後遍歷右子樹;因此一個preorder序列有這樣一個特色,左子樹的序列一定都在右子樹的序列以前;而且左子樹的序列一定都小於根節點,右子樹的序列都大於根節點;leetcode
根據上面的特色很容易經過遞歸的方式完成:get
若是序列只有一個元素,那麼確定是正確的,對應只有一個節點的樹;class
若是多於一個元素,以當前節點爲根節點;並從當前節點向後遍歷,直到大於根節點的節點出現(或者到尾巴),那麼根節點以後,該大節點以前的,是左子樹;該大節點及以後的組成右子樹;遞歸判斷左右子樹便可;遍歷
那麼何時一個序列確定不是一個preorder序列呢?前面獲得的右子樹,若是在其中出現了比根節點還小的數,那麼就能夠直接返回false了;im
代碼以下:img
public boolean verifyPreorder(int[] preorder) { return verifyPreorder(preorder, 0, preorder.length); } public boolean verifyPreorder(int[] seq, int start, int end) { if (start + 1 >= end) { return true; } int root = seq[start]; int i = start + 1; while (i < end && seq[i] < root) { i++; } if (i < end) { int j = i; while (j < end && seq[j] > root) { j++; } if (j < end) { return false; } return verifyPreorder(seq, start + 1, i) && verifyPreorder(seq, i, end); } else { return verifyPreorder(seq, start + 1, end); } }