剑指offer系列之二十二:二叉搜索树的后续遍历序列

简介:

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

此题仍然是对二叉树遍历方法的考察,但是与直接对遍历方法的考察不太一样,因为这里的输入是后续遍历的序列,所以要判断该序列是否是某二叉树的后续遍历结果,关键在于找出根节点,根节点的左子树和根节点的右子树,然后继续对左子树和右子树进行判断,直到全部元素访问完毕。这里很显然是一个递归的过程。由于后续遍历是先访问双亲节点,接着访问左孩子,再访问右孩子,所以需要对每个节点的左右子树做进一步的判断。

明白思路后,可以写出如下的实现代码(已被牛客AC):

package com.rhwayfun.offer;


public class VerifySequenceOfBiST {
    public boolean VerifySquenceOfBST(int[] sequence) {
        if(sequence.length <= 0) return false;
        int rootVal = sequence[sequence.length - 1];

        int i = 0;
        for(; i < sequence.length - 1; i++){
            if(sequence[i] > rootVal) break;
        }
        //拷贝左子树到一个新的数组
        int[] leftTree = new int[i];
        System.arraycopy(sequence, 0, leftTree, 0, i);

        int j = i;
        for(; j < sequence.length - 1; j++){
            if(sequence[j] < rootVal) return false;
        }
        //拷贝右子树到一个新数组
        int[] rightTree = new int[sequence.length - i - 1];
        System.arraycopy(sequence, i, rightTree, 0, sequence.length - i - 1);

        boolean verifyLeft = true;
        if(i > 0){
            verifyLeft = VerifySquenceOfBST(leftTree); 
        }

        boolean verifyRight = true;
        if(i < sequence.length - 1){
            verifyRight = VerifySquenceOfBST(rightTree);
        }

        return verifyLeft && verifyRight;
    }

    public static void main(String[] args) {
//      int[] sequence = new int[]{5,7,6,9,11,10,8};
        int[] sequence = new int[]{7,4,6,5};
        System.out.println(new VerifySequenceOfBiST().VerifySquenceOfBST(sequence));

    }
}
AI 代码解读
目录
打赏
0
0
0
0
85
分享
相关文章
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
50 0
leecode刷题 将有序数组转换为二叉搜索树
给定一个升序排列的整数数组 `nums`,要求将其转换为一棵高度平衡的二叉搜索树(BST)。通过递归方法,选择数组中间元素作为根节点,左半部分构建左子树,右半部分构建右子树。优化后的代码使用索引递归,避免了数组复制操作,提高了效率。
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
56 0
|
10月前
【一刷《剑指Offer》】面试题 18:树的子结构
【一刷《剑指Offer》】面试题 18:树的子结构
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
66 0
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力(上)
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
141 0
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力(下
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
104 0
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
剑指Offer - 面试题7:重构二叉树 (力扣 - 105、从前序与中序遍历序列构造二叉树)
剑指Offer - 面试题7:重构二叉树 (力扣 - 105、从前序与中序遍历序列构造二叉树)
78 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等