剑指offer15 JZ33 二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列

https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=23289&ru=%2Fpractice%2F7fe2212963db4790b57431d9ed259701&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13

  • 首先是二叉搜索树(左子树每个节点的值 < 该节点的值 < 右子树每个节点的值)的特点;
  • 其次是后序遍历(对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身)的特点。 alt
  1. 第一步:找到数组最后一位,即根节点root。 紧接着
  2. 第二步:获取整个数组的长度,开始遍历并与root值比较,第一个大于root的值就是左右子树的分界点。 alt
  3. 第三步:遍历右子树,验证是否符合二叉搜索树的概念;如上图,以12为分界点的右边所有节点都是大于root的,所以是符合二叉搜索树的。
  4. 第四步:继续往下递归,查看余下的左右子树是否符合。这里再放一个不符合的数组案例给大家对比一下,数字图标表示步骤: alt
public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        int size=sequence.length;
        if(size==0){
            return false; //空节点不是搜索数
        }
        return check(sequence,0,size-1);
    }
    public boolean check(int [] sequence,int left ,int right){
        if(left>=right){
            return true; //只有一个节点 程序出口
        }
        int root=sequence[right];//找到根节点
        //划分出右子树 从根节点的左边第一个节点开始
        int r=right-1;
        //第一个大于根节点的的数就是左右子树的分界点
        while(r>=0&& sequence[r]>root){
            r--;
        }
        //检查左子树是否合法,左子树所有节点要小于根节点
        for(int i=left;i<=r;i++){
            if(sequence[i]>root){
                return false;
            }
        }
        //递归检查左子树右子树
        return check(sequence,left,r) && check(sequence,r+1,right-1);
     
        
    }
}
全部评论

相关推荐

野猪不是猪🐗:我assume that你must技术aspect是solid的,temperament也挺good的,however面试不太serious,generally会feel style上不够sharp
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务