输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true
,否则返回 false
。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5 / \ 2 6 / \ 1 3
示例 1:
输入: [1,6,3,2,5] 输出: false
示例 2:
输入: [1,3,2,6,5] 输出: true
题解:
这个问题其实考察的是对二叉搜索树的特性的理解,根节点的值大于左子树所有节点的值,小于所有右子树所有节点的值
后序遍历的序列,最后一位便是根节点,而序列中从前往后找到第一位大于根节点的位置,便是进入右子树的位置
public class VerifyPostorder {
public boolean verifyPostorder(int[] postorder) {
if (postorder.length<=2) {
return true;
}
return verify(postorder, 0, postorder.length-1);
}
public boolean verify(int[] postorder,int left,int right) {
if (left>=right) {
return true;
}
int rootnode = postorder[right];//找到当前树的根节点
int k=left;
while (k<right && postorder[k]<rootnode) {
k++;//找到右子树的起始位置
}
for (int i = k; i < right; i++) {
if (postorder[i]<rootnode) {
return false;//右子树所有值一定大于根节点,否则就返回false
}
}
if (!verify(postorder, left, k-1)) {//递归去判断左右子树
return false;
}
if (!verify(postorder, k, right-1)) {
return false;
}
return true;
}
}