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); } }