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

问题描述:

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

背景知识:

二叉搜索树(Binary Search Tree),又叫二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

算法描述:

将数列分为三段,最后一段是最后一个数,也是树的根;第一段小于根,第二段大于根:

| 小于根 | 大于根 | 根 |

然后小于根和大于根这两段又都是树,就可以递归求解了。

当树的大小为0或1时,返回true。

代码:

classSolution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size() == 0) {
            return false;
        }
        returnVerify(sequence);
    }

    bool Verify(vector<int> sequence) {
        intsize = sequence.size();
        if(size <= 1) {
            return true;
        }

        //开始切割数列
        vector<int> smaller;  //第一段,比root小
        vector<int> larger;       //第二段,比root大
        //根的值
        introot = sequence[size - 1];
        //判断此时是否还在第一段,若已经在第二段,但又回到了第一段
        //则返回false
        bool isOne = false;
        //如果第一个数小于root,则表明有第一段,isOne为true
        if(sequence[0] < root) {
            isOne = true;
        }
        for(inti = 0; i < size - 1; i++) {
            //比根小
            if(sequence[i] < root) {
                if(isOne == false) {
                    returnfalse;
                }
                smaller.push_back(sequence[i]);
            }
            //比根大
            else{
                if(isOne)
                    isOne = false;
                larger.push_back(sequence[i]);
            }
        }

        returnVerify(smaller) && Verify(larger);
    }
};

总结:

应该多弄点测试用例,自己测试完后,再提交

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 05:21:54

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

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

剑指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系列源码-二叉搜索树的后序遍历序列

题目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最

【Java】 剑指offer(33) 二叉搜索树的后序遍历序列

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路 二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面.根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所要求的判断功能. 测