【ACWing】46. 二叉搜索树的后序遍历序列

题目地址:

https://www.acwing.com/problem/content/description/44/

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

数据范围:
数组长度 [ 0 , 1000 ] [0,1000] [0,1000]

可以用DFS。首先最后一个数一定是树根,那么从左向右找第一个大于树根的位置,如果从该位置开始向后有小于树根的数,则说明不是BST,返回false。否则递归判断左右子树。代码如下:

#include <vector>
using namespace std;

class Solution {
 public:
  bool verifySequenceOfBST(vector<int> v) { return dfs(0, v.size() - 1, v); }

  bool dfs(int l, int r, vector<int>& v) {
    if (l >= r) return true;
    int root = v[r], k = l;
    while (k < r && v[k] < root) k++;
    for (int i = k; i < r; i++)
      if (v[i] < root) return false;

    return dfs(l, k - 1, v) && dfs(k, r - 1, v);
  }
};

平均时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间 O ( log ⁡ n ) O(\log n) O(logn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值