剑指——二叉搜索树的后序遍历

二叉搜索树的后序遍历

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



解题思路

给出的数组是后序遍历,那么最后一个元素对应着树的根节点。

数组前部分对应左子树,其中元素都小于根节点;后部分对应右子树,其中元素都大于根节点。

再分别对左右子树进行递归地判断。


public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        //在Java中,数组指向unll和数组为空是不一样的概念,要将这两种特殊情况都排除
        if(sequence == null || sequence.length == 0)
            return false;
        //
        return helpVerify(sequence, 0, sequence.length - 1);
    }
    /**
    *helpVerify方法用于判断当前这个数组是否满足二叉搜索树的后序遍历数组
    *seq:当前被判断的数组
    *start:当前数组的第一个元素的下标
    *end:当前数组的最后一个元素的下标
    **/
    public boolean helpVerify(int[] seq, int start, int end){
        if(start >= end)
            return true;
        int root = seq[end];
        int i;
        //找到左右子树的分割处
        for(i = start; i < end - 1; i ++){
            if(seq[i] > root)
                break;
        }
        //判断分割处之后的数字是否都大于根节点的值,若不是则返回false
        for(int j = i; j < end - 1; j ++){
            if(seq[j] < root)
                return false;
        }
        //递归地判断左右子树
        return helpVerify(seq, start, i) && helpVerify(seq, i, end - 1);
    }
}

原文地址:https://www.cnblogs.com/peekapoo/p/12113552.html

时间: 2024-08-25 16:02:39

剑指——二叉搜索树的后序遍历的相关文章

23、剑指offer--二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路:本题中的树为二叉搜索树,满足左<根<右 1)求出数组最后一个元素,为根节点 2)遍历,将所有连续小于sequence[n-1]的存入vector left中 3)将连续大于的存入vector right中  如果存在小于的,则直接返回false,无法构造二叉搜索树 4)然后对left进行递归处理,如果right为空则直接返回left_v

剑指offer---二叉搜索树的后序遍历序列

class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { vector<int> right; vector<int> left; int size = sequence.size(); int last = sequence[size - 1]; if (size== 0) { return false; } //left int mid = 0; for (int i = 0;

剑指Offer-- 二叉搜索树的后序遍历序列判断

版本1:C++ class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if (sequence.size() == 0) return false; int len = sequence.size(),i = 0,j; int root = sequence[len - 1]; // 根节点 vector<int> leftTree, rightTree; while (sequence[i

【Java】 剑指offer(33) 二叉搜索树的后序遍历序列

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路 二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面.根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所要求的判断功能. 测

剑指OFFER 二叉搜索树的后序遍历

剑指OFFER 二叉搜索树的后序遍历 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析 判断是否是二叉搜索树的后序遍历结果,那么得先明白什么是二叉搜索树,还有什么是后序遍历 这是一颗二叉搜索树,其每个节点都满足 左孩子<父母<右孩子 其后序遍历为 4 7 5 10 12 11 9 [ 小][ 大 ][中] 然后小部分/大部分内部也同样满足这样的规律,那么,用递归是最方便的 代码 class

剑指offer——二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出true,否则输出false.假设输入的数组的任意两个数字都不相同. 思路:首先二叉搜索树是指左子树全部小于根节点,右子树全部大于根节点的树.故: 对于一棵树:首先找到右子树的第一个节点,然后判断右子树中是否有小于根节点的节点,若有,则输出false. 1 public class Solution { 2 public boolean VerifySquenceOfBST(int [] sequence) { 3

二叉搜索树的后序遍历序列-剑指Offer

二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路 后序遍历:左-->右-->根节点 二叉搜索树中,左子树的节点小于根节点,右子树的节点大于根节点 递归调用,根据大小区别左右子树,若在右子树中发现小于根节点的节点,就不是后续遍历序列 举一反三:如果要求处理一棵二叉树的遍历序列,我们可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子

20,判断是不是二叉搜索树的后序遍历《剑指offer》

题目: 给定一个序列,判断是不是二叉搜索树的后序遍历 思路: 递归版: 一个正确的后序遍历可以分为三段来看: 1:最后一个值是根节点   2:左子树节点(都比根节点值小) 3:右子树节点(都比根节点大) 且满足左子树个数加右子树个数等于N-1:(N为后序遍历的节点总个数) 左子树和右子树又可以进行同样的操作,,,perfect的递归定义哈 然后判断出口: 1,正确的出口,子树只有一个元素或者零个元素(这零就是为什么要多写一个函数的原因了..) 2,错误的出口,左子树加上右子树的个数不等于N-1

剑指offer(五十九)之二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路分析:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列. public class Solution { public boolean VerifySquenceOfBST(