1.题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。
2.解法
2.1 树的结构
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
2.2 解法
二叉搜索树的特点是 左子树的所有元素值 < 根的值 < 右子树所有的元素值
那么二叉搜索树的后序遍历 LEFT + RIGHT + ROOT
通过一次遍历可以知道 左子树在哪部分,于是右子树就是剩下的那部分。如果右子树存在小于根节点的值,说明不合法。
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null||sequence.length==0) return false;
return helper(sequence,0,sequence.length-1);
}
public boolean helper(int[] sequence,int start,int end){
if(start>=end) return true;
int root = sequence[end];
int index = start;
boolean flag = false;
for(int i=start;i<end;i++){
int cur = sequence[i];
if(cur>sequence[end]&&!flag) {
flag = true;
index = i;
}
if(flag) {
if(cur<sequence[end]) return false;
}
}
return helper(sequence,start,index-1)&&helper(sequence,index,end-1);
}
总结
通过一次遍历可以知道 左子树在哪部分,于是右子树就是剩下的那部分。如果右子树存在小于根节点的值,说明不合法。
算法系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/alg
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。