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

题目描述

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

思路:这题目有点特殊,主要在于序列为空的时候,不是后序遍历,返回的是false,但是在递归的时候,递归基要写true,因为如果写false,那么递归的所有结果都是false。

step1:首先找到最后一个就是根节点;

step2:然后比较左子树,是否都比root的值小,得到左子树的位置i - 1,并且存储左子树的所有值;

step3:从位置i开始,比较右子树的值是否都大于root,如果小于则返回false,并且存储右子树的所有值;

step4:递归的比较左右子树。

 1 class Solution {
 2 public:
 3     bool VerifySquenceOfBST1(vector<int> sequence) {
 4         if(sequence.size() == 0){
 5             return true;
 6         }
 7         int i = 0,j = 0;
 8         int root = sequence[sequence.size() -1];
 9         vector<int> leftSeq,rightSeq;
10
11         for(i;i < sequence.size() - 1;++i){
12             if(sequence[i] > root){
13                 break;
14             }
15             leftSeq.push_back(sequence[i]);
16         }
17
18         for(j = i;j < sequence.size() - 1;++j){
19             if(sequence[j] < root){
20                 return false;
21             }
22             rightSeq.push_back(sequence[j]);
23         }
24         bool left = true;
25         left = VerifySquenceOfBST1(leftSeq);
26         bool right = true;
27         right = VerifySquenceOfBST1(rightSeq);
28         return left && right;
29     }
30     bool VerifySquenceOfBST(vector<int> sequence){
31         if(sequence.size() == 0){
32             return false;
33         }
34         return VerifySquenceOfBST1(sequence);
35
36     }
37 };

一定要注意32行和第2行的不同。

时间: 2024-10-07 21:20:21

剑指offer 二叉树的后序遍历序列的相关文章

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

思路:对于一个二叉树的后序遍历序列来说,最后一个数一定是根节点,然后前面的数中,从最开始到第一个大于根节点的数都是左子树中的数,而后面到倒数第二个数应该都是大于根节点的,是右子树,如果后面的数中有小于根节点的,那么说明这个序列不是二叉搜索树的后序遍历序列. public class JudgeHouxubainli { public static void main(String[] args) { int[] array = {4,8,6,12,16,14,10}; boolean resul

判断序列是否是二叉树的后序遍历序列

这个题的意思就是给定一个序列,判断这个序列是否是某个二叉排序树的后序遍历序列,这个算法的方法主要是根据后序遍历的性质,首先这个序列的最后一个元素肯定是根元素,然后将序列从左往右遍历,找到第一个大于根元素的点,这个点左边的肯定是当前根的左子树,这个点的右边肯定是当前根的右子树,继续向后遍历,看右子树中是否有值小于根,如果有,则false,否则分左右子树分别再次调用函数进行判断.具体代码如下: 1 public class IsLastOrder{ 2 3 public boolean islast

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列

首先介绍一下三种遍历顺序的操作方法: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知先序和中序遍历序列,求后序遍历序列. 已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,

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

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

剑指offer (24) BST的先序或后序遍历序列的正确性

题目:输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历序列 假设输入的数组的数字均不相同 解题分析: 对于二叉搜索树,中序序列一定是升序的,我们将后序遍历序列排序,结果即为 中序遍历序列 如果该后序遍历序列是正确的,那么 由 中序遍历序列和后序遍历序列 一定可以构建一棵二叉树 如果不能成功构建一棵二叉树,那么该后序遍历序列一定是错误的 题目即转化为 由 后序遍历序列和中序遍历序列构建一棵二叉树 主要思路就是 在中序中找根节点然后划分左右子树 详见笔者博文:http://www.cnbl

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

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

剑指Offer面试题24(Java版):二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如输入数组{5,7,6,9,11,10,8}则返回true,因为这个整数序列是下图二叉树的后序遍历的结果.如果输入的数组是{7,4,6,5},由于没有哪颗二叉搜索树的后续遍历的结果是这个序列,因此返回false. 在后序遍历得到的序列中,最后一个数字是树的根节点的值.数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根节点的值

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

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 基本思路 在后序遍历得到的序列中,最后一个数字是树的根节点的值.数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小:第二部分是右子树节点的值,他们都比根节点的值大. 以数组{5,7,6,9,10,8}为例,后序遍历结果的最后一个数字8就是根节点的值.在这个数组中,前3个数字5,7和6都比8小,是值为8的节点的左子树节点: