判断数组是不是某二叉搜索树的后序遍历

题目:输入一个数组,判断数组是不是某二叉搜索树的后序遍历。输入的数组的任意两个数字都不相同

分析:要明白题目的意思,意思就是判断一个数组是否是某个搜索树的后序遍历。首先要搞清搜索树的含义:跟结点大于左子树而小于右子树。其次,数组的最后一个结点一定是后序遍历的根节点。所以我们只要满足这两个条件,再通过递归就可以解出来了。代码如下:

// 二叉搜索树的遍历序列.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

bool isPostBST(int sequence[], int length)   //注意这里传入的sequence就是指向序列的第一个结点
{
    //1.容错性
    if (sequence==NULL||length<=0)
        return false;

    //2.先要找到序列的分界点,此时因为对左子树进行了遍历所以也相当于对左子树进行了判断
    int i;  //分界点
    for (i = 0; i < length - 1; i++)
    {
        if (sequence[i]>sequence[length - 1])
            break;
    }
   //3.对序列的右子树进行判断
    for (int j = i; j < length-1; j++)
    {
        if (sequence[j] < sequence[length - 1])
            return false;
    }
  //4.当左右子树都满足的时候就要进行递归
    if (i >= 1)//左边至少有两个点的时候
        return isPostBST(sequence, i);

    if (i <= length - 3)//右子树至少有两个点的时候
        return isPostBST(sequence + i, length -i-1);//i是左子树的数目,1是根节点的数目

    return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
    //int s[] = {7,4,6,5};
    //int s[] = { 7, 8, 6, 5 };
    int s[] = { 5,7,6,9,11,10,8 };
    if (isPostBST(s,7))
        cout<< "输入的数组为某个二叉搜索树的后序遍历!" << endl;
    else
        cout<< "输入的数组不是任何二叉搜索树的后序遍历!" << endl;
    return 0;
}

结果:

输入数组:5,7,6,9,11,10,8

输入数组:7,4,6,5

输入数组:7,8,6,5

判断数组是不是某二叉搜索树的后序遍历

时间: 2024-08-27 04:48:56

判断数组是不是某二叉搜索树的后序遍历的相关文章

剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)

二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路:由于是后序遍历,所以数组的最后一个节点是根节点,而且,由于是二叉收索树,所以,前面的数据被分为两部分,右边部分比根节点小,左边比根节点大.左右两边又分别为二叉收索树,因此可以用递归来实现. Java代码: public class IsBinarySearchTree { public boolea

判断一个数组是否是二叉搜索树的后序遍历序列 24

引言 ? ? 继续二叉树,这个题考的知识点是二叉树的后续遍历 ? ? 分析问题 ? ? 对于一个二叉树的后序遍历序列来说,最后一个数一定是根节点,然后前面的数中,从最开始到第一个大于根节点的数都是左子树中的数,而后面到倒数第二个数应该都是大于根节点的,是右子树,如果后面的数中有小于根节点的,那么说明这个序列不是二叉搜索树的后序遍历序列 ? ? 解决问题 ? ? 同样是用递归去做,首先要考虑Corner Case,如果array为空,那么返回false ? ? 然后找到根节点,根节点是array最

判断一个数组是否是二叉搜索树的后序遍历(java)

分析: 代码: package Tree; public class VerifyBST { //第一个元素下标low,最后一个元素下标high public static boolean verifySequenceBST(int[] sequence,int low,int high){ if(sequence == null || high-low <0){ return false; } int root = sequence[high]; int i; //在二叉搜索树左子数的结点小于

判断数组是否为某二叉搜索树的后序遍历

1 /************************************************************************* 2 > File Name: 22_SequenceOfBST.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 20时34分33秒 6 ***********************************

判断某数组是否是某二叉搜索树的后序遍历的结果

题目: 输入一个数组,判断该数组是不是某二叉搜索树的后序遍历结果. 解答: 1 public class Solution { 2 3 public static void main(String[] args) { 4 int[] array = {5,7,6,9,11,10,8}; 5 6 boolean b = verfiySequenceOfBST(array, 0, 6); 7 System.out.println(b); 8 } 9 10 private static boolean

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

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析:采用递归的思想,先找出根节点,左子树元素都必须比根节点小,右子树节点都比根节点大,否则返回false. 得到子树(子序列)的两种方法: ①用下标把数组 逻辑分为几个子数组(这里采用的是这种) ②用工具类Arrays把数组分割 public class Solution {    public boolean VerifySquenceOfBST(int

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

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

24 - 判断是否是二叉搜索树的后序遍历序列

剑指offer 24题 题目描述:http://ac.jobdu.com/problem.php?pid=1367 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 搜索二叉树的特征: 左子树的节点小于根 右子树的节点大于根 任意子树都是搜索二叉树 而后序遍历时,左右根,序列的最后一项总是根.在序列中找到根的位置,根前面的序列是左子树,根后面的序列是右子树,递归地判断左右子树是否是BST. #include

二叉搜索树的后序遍历判断

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 之前对于二叉搜索树,只知道中序遍历是递增的,今天做到这道题目,要求判断数组是不是二叉搜索树后序遍历的结果,一开始有点懵,后来在纸上画画,感觉很像递归的感觉,有一种特别像归并排序的那种感觉一样,然后发现对于每一个树的子结构而言,我们将其分成左右子树两部分就可以很明白这种递归的结构了,分成两部分,然后分别对左右在递归,直到叶子节点 1 public c