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

题目描述

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

基本思路

  在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,他们都比根节点的值大。

  以数组{5,7,6,9,10,8}为例,后序遍历结果的最后一个数字8就是根节点的值。在这个数组中,前3个数字5,7和6都比8小,是值为8的节点的左子树节点;后3个数字9,11和10都比8大,是值为8的节点的右子树节点。

  接下来用同样的方法确定与数组每一部分对应的子树的结构,这其实是一个递归的过程。对于序列5,7,6,最后一个数字6是左子树的根节点的值。数字5比6小,是值为6的节点的左子树,而7则是它的右子节点。同样,在序列9,11,10中,最后一个数字10是右子树的根节点,数字9比10小,是值为10的节点的左子节点,而11则是它的右子节点。

  分析另一个整数数组{7,4,6,5}。后序遍历的最后一个数字是根节点,因此根节点的值是5。由于第一个数字7大于5,因此对应的二叉搜索树中,根节点没有左子树,数字7,4和6都是右子树的节点的值。但右子树中有一个值为4的节点,比根节点的值5小,违背了二叉搜索树的定义。因此不存在一棵二叉搜索树,它的后序遍历序列是7,4,6,5。

Java代码

package com.swordOffer.sequenceOfBST15;

import java.util.Scanner;

/**
 * Created by Feng on 2017/5/14.
 * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
 * 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
 */
public class SequenceOfBST {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();//数组的大小
            int[] postOrder = new int[n];
            for (int i = 0; i < n; i++) {
                postOrder[i] = sc.nextInt();
            }

            boolean result = verifySquenceOfBST(postOrder);
            if (result) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }

    public static boolean verifySquenceOfBST(int[] sequence) {
        if (sequence.length <= 0) {
            return false;
        }

        return isTreeBST(sequence, 0, sequence.length - 1);
    }

    private static boolean isTreeBST(int[] sequence, int start, int end) {

        //如果至多只有一个元素
        if (end <= start) {
            return true;
        }

        int i = start;

        //在二叉树搜索中左子树的节点小于根节点
        for (; i < end; i++) {
            if (sequence[i] > sequence[end]) {
                break;
            }
        }

        //在二叉树搜索树中右子树的节点大于根节点
        for (int j = i; j < end; j++) {
            if (sequence[j] < sequence[end]) {
                return false;
            }
        }

        return isTreeBST(sequence, start, i - 1) &&
                isTreeBST(sequence, i, end - 1);

    }
}
时间: 2024-11-07 11:50:07

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

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

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

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

问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 背景知识: 二叉搜索树(Binary Search Tree),又叫二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 算法描述: 将数列分为三段,最后一段是最后一个数,也是树的

[剑指offer] 判断二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入描述 整数数组 输出描述 布尔值 题目分析 什么是二叉搜索树? 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二

剑指Offer 23. 二叉搜索树的后序遍历序列 (二叉搜索树)

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目地址 https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. class Solution: """ 一个二叉搜索树BST满足: max(左子树) < 根节点 < min(右子树) 由于题目给出的是一个后序遍历,那么序列的最后一个元素就应该是根节点. 因此我们从BST的定义出发,遍历整个序列,找到第一个大于根节点的元素k,k以前的元素属于左子树, 从k开始到根节点之前的元素属于右

[剑指Offer] 23.二叉搜索树的后序遍历

[思路]BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列.下面是在讨论中看到的一份代码,已学习到. 1 class Solution { 2 public: 3 bool VerifySquenceOfBST(vector<int> sequence) { 4 int size = sequence.size(); 5 if

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

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

剑指offer之【二叉搜索树的后序遍历序列】

题目: 二叉搜索树的后序遍历序列 链接: https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入

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

题目1367:二叉搜索树的后序遍历序列 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1359解决:684 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数n(1<=n<=10000),表示数组的长度. 第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]. 输出: 对应每个测试案例,如果输入数组是某二叉搜索树的