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

简介: 剑指offer 34. 二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。

如果是则返回true,否则返回false。

假设输入的数组的任意两个数字都互不相同。


数据范围

数组长度 [0,1000]。

样例

输入:[4, 8, 6, 12, 16, 14, 10]
输出:true


方法一:dfs O(n)


这道题根据后序遍历的性质进行 dfs 操作:


后序遍历数组的最后一个数为根结点。

从数组 l 的位置开始往后遍历,直至超过 r 或找到大于根结点第一个数。

如果有大于第一个根结点数,则判断该数到根结点之间的数是否都是大于根结点的,如果不是则输出 false 。

继续遍历根结点的左子树和右子树。

我们拿题目样例举例,看看具体是如何实现的:


第一步: 将数组的最后一个结点作为根结点,从 0 开始往后遍历,发现第一个大于根结点的元素 12 ,并且其后面到根结点的元素都要比根结点大,故满足要求,继续往根结点左右结点递归。

ec7b661679e34c99943e1b1491e3ddcd.png

第二步: 分别将最后一个元素 614 作为根结点,然后重复第一步操作,发现都满足要求,继续往后递归。

第三步: 发现都已经递归到叶子结点,并且都满足要求,故最终返回 true




ecab45582e0541d59a0f0f18f6c9b4cf.png

class Solution {
public:
    vector<int> seq;
    bool dfs(int l, int r)
    {
        if (l >= r)    return true;
        int root = seq[r];
        //找到第一大于根节的数
        int k = l;
        while (k < r && seq[k] < root)    k++;
        //判断第一个大于根结点的数到根结点之间的数是否都大于根结点
        for (int i = k; i < r; i++)
            if (seq[i] < root)
                return false;
        return dfs(l, k - 1) && dfs(k, r - 1);  //继续遍历左右子树
    }
    bool verifySequenceOfBST(vector<int> sequence) {
        seq = sequence;
        return dfs(0, sequence.size() - 1);
    }
};


欢迎大家在评论区交流~





目录
相关文章
|
7月前
|
算法 程序员
【算法训练-二叉树 二】【重建二叉树】依据前序与中序遍历序列重建二叉树
【算法训练-二叉树 二】【重建二叉树】依据前序与中序遍历序列重建二叉树
76 0
|
7月前
|
Linux
数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度
【剑指offer】-二叉搜索树的后序遍历序列-23/67
【剑指offer】-二叉搜索树的后序遍历序列-23/67
剑指offer 58. 二叉搜索树的第k个结点
剑指offer 58. 二叉搜索树的第k个结点
55 0
|
存储
刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历
刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历
148 0
|
算法 前端开发 程序员
二叉树的后序遍历序列
二叉树的后序遍历序列
二叉树的后序遍历序列
|
算法
数据结构:根据二叉树先序遍历和中序遍历求后序遍历序列。(这大概是最简单的方法,不服来评论)
数据结构:根据二叉树先序遍历和中序遍历求后序遍历序列。(这大概是最简单的方法,不服来评论)
141 0
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历
121 0