24 二叉搜索树的后序遍历序列

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

C++:

 1 class Solution {
 2 public:
 3     bool VerifySquenceOfBST(vector<int> sequence) {
 4         if (sequence.empty())
 5             return false ;
 6         return Verify(sequence , 0 , sequence.size()-1) ;
 7     }
 8
 9     bool Verify(vector<int> sequence,  int left , int right) {
10         if (right - left <= 0)
11             return true ;
12         int rootValue = sequence[right] ;
13         int cutIndex = left ;
14         for(; cutIndex < right ; cutIndex++){
15             if (sequence[cutIndex] > rootValue)
16                 break ;
17         }
18         for(int i = cutIndex ; i < right ; i++){
19             if (sequence[i] < rootValue)
20                 return false ;
21         }
22         return Verify(sequence , left , cutIndex-1) && Verify(sequence , cutIndex , right-1) ;
23     }
24 };

原文地址:https://www.cnblogs.com/mengchunchen/p/8963762.html

时间: 2024-11-05 12:26:06

24 二叉搜索树的后序遍历序列的相关文章

《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版

(判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道题不禁让人想起用一个普通二叉树的前序(或后序)遍历序列加上中序遍历序列就可以还原一棵二叉树,在那道题中,我们知道前序或后序序列就能开始组织根节点,但是因为我们无法确定子树的个数,所以还需要一个辅助的序列来确定子树范围.但如果改成BST的前序或后序遍历序列,我们就可以直接组织二叉树,BST的特性帮我们

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

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

剑指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

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

二叉树的层次遍历(队列) and 二叉搜索树的后序遍历序列

(一)从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.[层次遍历] 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的操作,直至队列中所有的节点都被打印出来为止. //二叉树的层次遍历#include<iostream>#include<queue>using namespace std; typedef int ElemType;typedef st

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

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

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

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

剑指Offer对答如流系列 - 二叉搜索树的后序遍历序列

面试题33:二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如,输入数组{5.7.6.9.11.10.8},则返回true,因为这个整数序列是下图二叉搜索树的后序遍历结果. 如果输入的数组是{7.4.6.5},则由于没有哪棵二叉搜索树的后序遍历是这个序列,因此返回false. 问题分析 后序遍历 遍历顺序是 :左子树 -> 右子树 -> 根结点(最后遍历根节

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

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