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

 1 /*************************************************************************
 2     > File Name: 22_SequenceOfBST.cpp
 3     > Author: Juntaran
 4     > Mail: [email protected]
 5     > Created Time: 2016年08月30日 星期二 20时34分33秒
 6  ************************************************************************/
 7
 8 #include <stdio.h>
 9 #include <stdlib.h>
10
11 // 判断一个数组是不是某个二叉搜索树的后序遍历
12 bool isSequenceOfBST(int* sequence, int length)
13 {
14     if (sequence==NULL || length<=0)
15         return false;
16
17     int root = sequence[length-1];
18
19     int i, j;
20
21     // 二叉搜索树的左子树都小于根
22     for (i = 0; i < length-1; ++i)
23     {
24         if (sequence[i] > root)
25             break;
26     }
27
28     // 二叉搜索树的右子树都大于根
29     for (j = i; j < length-1; ++j)
30     {
31         if (sequence[j] < root)
32             return false;
33     }
34
35     // 递归判断左子树是不是二叉搜索树
36     bool left = true;
37     if (i > 0)
38         left = isSequenceOfBST(sequence, i);
39
40     // 递归判断右子树是不是二叉搜索树
41     bool right = true;
42     if (i < length-1)
43         right = isSequenceOfBST(sequence+i, length-i-1);
44
45     return (left && right);
46 }
47
48 int main()
49 {
50     int sequence1[] = {5,7,6,9,11,10,8};
51     int sequence2[] = {7,4,5,6};
52     bool ret1 = isSequenceOfBST(sequence1, 7);
53     bool ret2 = isSequenceOfBST(sequence2, 4);
54     if (ret1 == true)
55         printf("ret1 is true\n");
56     else
57         printf("ret1 is false\n");
58
59     if (ret2 == true)
60         printf("ret2 is true\n");
61     else
62         printf("ret2 is false\n");
63
64     return 0;
65 }
时间: 2024-10-10 07:27:57

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

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

#include <iostream> using namespace std; bool isPostorderOfBST(int postorder[], int low, int high) { if(postorder == NULL || low < 0 || high < 0) return false; if(low == high) return true; int pivot = high - 1; // 查找左子树与右子树的分界点 while(pivot >

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

题目: 输入一个数组,判断该数组是不是某二叉搜索树的后序遍历结果. 解答: 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

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

题目:输入一个数组,判断数组是不是某二叉搜索树的后序遍历.输入的数组的任意两个数字都不相同 分析:要明白题目的意思,意思就是判断一个数组是否是某个搜索树的后序遍历.首先要搞清搜索树的含义:跟结点大于左子树而小于右子树.其次,数组的最后一个结点一定是后序遍历的根节点.所以我们只要满足这两个条件,再通过递归就可以解出来了.代码如下: // 二叉搜索树的遍历序列.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream

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

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

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

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

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

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出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