23、剑指offer--二叉搜索树的后序遍历序列

题目描述

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

解题思路:本题中的树为二叉搜索树,满足左<根<右

1)求出数组最后一个元素,为根节点

2)遍历,将所有连续小于sequence[n-1]的存入vector left中

3)将连续大于的存入vector right中  如果存在小于的,则直接返回false,无法构造二叉搜索树

4)然后对left进行递归处理,如果right为空则直接返回left_val

5)对right做递归处理,如果left为空,则直接返回right_val

6)否则返回(left_val && right_val)

注意点:本题中如果要遍历的数组的长度为1了,直接返回true,否则,递归永远返回false

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 class Solution {
 5 public:
 6     bool VerifySquenceOfBST(vector<int> sequence) {
 7
 8         //根节点为数组最后一个元素
 9         int n = sequence.size();
10         if(n == 0)
11             return false;
12         if(n == 1)//没有此种情况,不行
13             return true;
14         int root = sequence[n-1];
15         vector<int> left;//存储左子树
16         vector<int> right;//存储右子树
17         //搜索二叉树,左子树均小于根,右子树均大于根
18         int i=0;
19         for(;i<n-1;i++)
20         {
21             if(sequence[i] > root)
22             {
23                 break;
24             }
25             left.push_back(sequence[i]);
26         }
27         //搜索二叉树,右子树均大于根
28         for(int j = i;j<n-1;j++)
29         {
30             if(sequence[j] < root)
31                 return false;
32             right.push_back(sequence[j]);
33         }
34
35         //遍历左子树
36         bool left_val = true;
37         left_val = VerifySquenceOfBST(left);
38
39         if(right.size()==0) //需要判断右子树是否为空,若只有左子树,返回
40             return left_val;
41         //遍历右子树
42         bool right_val = true;
43         right_val = VerifySquenceOfBST(right);
44
45         if(left.size()==0)
46             return right_val;
47
48         return (left_val && right_val);
49     }
50 };
51 int main()
52 {
53     vector<int> a;
54     a.push_back(5);
55     a.push_back(4);
56     a.push_back(3);
57     a.push_back(2);
58     a.push_back(1);
59
60     Solution s;
61     bool r = s.VerifySquenceOfBST(a);
62     if(r)
63     {
64         cout<<"true"<<endl;
65     }
66     else
67     {
68         cout<<"false"<<endl;
69     }
70     return 0;
71 }

时间: 2024-10-02 00:24:27

23、剑指offer--二叉搜索树的后序遍历序列的相关文章

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

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出true,否则输出false.假设输入的数组的任意两个数字都不相同. 思路:首先二叉搜索树是指左子树全部小于根节点,右子树全部大于根节点的树.故: 对于一棵树:首先找到右子树的第一个节点,然后判断右子树中是否有小于根节点的节点,若有,则输出false. 1 public class Solution { 2 public boolean VerifySquenceOfBST(int [] sequence) { 3

剑指OFFER 二叉搜索树的后序遍历

剑指OFFER 二叉搜索树的后序遍历 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析 判断是否是二叉搜索树的后序遍历结果,那么得先明白什么是二叉搜索树,还有什么是后序遍历 这是一颗二叉搜索树,其每个节点都满足 左孩子<父母<右孩子 其后序遍历为 4 7 5 10 12 11 9 [ 小][ 大 ][中] 然后小部分/大部分内部也同样满足这样的规律,那么,用递归是最方便的 代码 class

剑指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.假设输入的数组的任意两个数字都互不相同. 思路 后序遍历:左-->右-->根节点 二叉搜索树中,左子树的节点小于根节点,右子树的节点大于根节点 递归调用,根据大小区别左右子树,若在右子树中发现小于根节点的节点,就不是后续遍历序列 举一反三:如果要求处理一棵二叉树的遍历序列,我们可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子

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

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

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

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

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

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

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

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

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

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

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

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题解一:递归 后序遍历序列的最后一个元素为二叉树的根节点: 二叉搜索树左子树上所有的结点均小于根结点.右子树所有的结点均大于根 1 public static boolean VerifySquenceOfBST(int [] sequence) { 2 if(sequence.length==0){ 3 return false; 4 } 5 i