题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
题解
写任意一个二叉搜索树的后序遍历序列出来分析:
二叉搜索树的定义是 左节点 < 根节点,右节点 > 根节点
对于后序遍历的序列T,最后一个元素X就是根节点 ,如果去掉X,那么T满足:
T可以分成两段,前一段 < X ,后一段 > X , 且这两段都满足后序序列
完美的递归定义
递归思路:
- 确定root
- 遍历,找到第一个大于root的值的位置 , 则该位置左边是左子树,右边是右子树
- 遍历右子树,如果都大于 root,则满足二叉搜索树,否则 返回 false
- 分别判断左子树和右子树是否仍是二叉搜索树(递归1,2,3)
public boolean VerifySquenceOfBST(int[] sequence) { if (sequence.length == 0) return false; return isBST(sequence,0,sequence.length - 2); } public boolean isBST(int[] sequence,int lo ,int hi){ if (lo >= hi) return true; int root = sequence[hi + 1]; int i = lo; while (i < hi){ if (sequence[i] < root) i++; else break; } int j = i+1; while (j <= hi){ if (sequence[j++] < root) return false; } //递归左右子树 return isBST(sequence,lo,i - 1) && isBST(sequence,i+1,hi -1); }