当前位置: 首页 > news >正文

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

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


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

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

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

数据范围

数组长度 [ 0 , 1000 ] [0,1000] [0,1000]

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

算法思路 :
  1. 基本思想

    • 利用后序遍历特性:序列最后一个元素为根节点
    • 递归验证左子树所有节点 < 根节点 < 右子树所有节点
  2. 验证过程

    • 基准条件:当子序列长度 ≤ 1 时返回true
    • 划分左右子树
      1. 定位第一个≥根节点的元素作为分界点
      2. 验证右子树部分全部>根节点
    • 递归验证
      • 左子树区间[l, k-1]
      • 右子树区间[k, r-1](排除末尾根节点)
  3. 实现特点

    • 使用类成员变量seq避免参数传递
    • 原地划分不需要额外空间
复杂度类型分析结果说明
时间复杂度O(n²)最坏情况下(链式树)需要n+(n-1)+…+1次比较
空间复杂度O(n)递归栈深度最大为树高,最坏情况下(链式树)为O(n)
  • 最优情况(平衡二叉树):O(nlogn)
  • 最坏情况(单支树):O(n²)
  • 平均情况:O(nlogn)
class Solution {
public:vector<int> seq;bool verifySequenceOfBST(vector<int> sequence) {seq = sequence;return dfs(0, sequence.size() - 1);}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 + 1; i < r; i ++){if(seq[i] < root) return false;}return dfs(l, k - 1) && dfs(k, r - 1);}
};

算法优化方向 :

  1. 单调栈解法:可优化至O(n)时间复杂度
  2. 剪枝策略:当发现非法右子树节点时立即终止递归
  3. 迭代实现:用栈替代递归可优化空间复杂度为O(1)(尾递归优化)

相关文章:

  • OpenCV根据模板图像寻找环境中的目标
  • 状态压缩与前缀和的魔力:破解LeetCode 1371元音之谜
  • RAG实践:Routing机制与Query Construction策略
  • Gemini 2.5 Flash-Lite 新版解析:与 Pro 和 Flash 版本的性能对比
  • JavaEE-Spring-IoCDI
  • 深入探索 UnoCSS:下一代原子化 CSS 引擎
  • HTML 与 CSS 的布局机制(盒模型、盒子定位、浮动、Flexbox、Grid)问题总结大全
  • 股指期货套期保值是利好还是利空?
  • 数组和指针
  • django 获取 filter后的某一个属性的list
  • 阿里云主机自动 HTTPS 证书部署踩坑实录
  • JavaScript 循环方式:全面解析与性能对比
  • Java求职者面试题详解:核心语言、计算机基础与源码原理
  • 爬虫技术:数据挖掘的深度探索与实践应用
  • C++/OpenCV 图像预处理与 PaddleOCR 结合进行高效字符识别
  • 计算无线电波在大气中传播衰减的算法
  • UL/CE双认证!光宝MOC3052-A双向可控硅输出光耦 智能家居/工业控制必备!
  • Tailwind Css V4 在vite安装流程
  • 《Effective Python》第九章 并发与并行——使用 Queue 实现并发重构
  • 数据结构--栈和队列
  • 石家庄城市建设投资中心网站/seo网站优化知识
  • 辽宁高速公路建设管理局网站/seo职位具体做什么
  • 如何制作图片配文字/郑州seo关键词优化公司
  • 网站建设平台怎么做/百度关键词搜索排名多少钱
  • 保洁公司注册需要什么条件/店铺seo是什么意思
  • 盐城专业做网站的公司哪家好/友情链接交换源码