剑指 Offer 33. 二叉搜索树的后序遍历序列

思路#

方法一:递归#

1.最后一个节点为根节点
2.左边的节点全部要小于根,右边的节点全部要大于根,因此数组可以分成两个区间,前半部分全部小于根,后半部分全部大于根
3.找到两个区间的分割点,判断是否两个区间是否符合该性质

 

复制代码
 1 class Solution {
 2 public:
 3     bool verifyPostorder(vector<int>& postorder) {
 4         if(postorder.empty()) {
 5             return true;
 6         }
 7 
 8         return check(postorder, 0, postorder.size()-1);
 9     }
10 
11 
12     bool check(vector<int>& postorder, int L, int R) {
13         if(L >= R)  
14             return true;
15 
16         /*根据二叉搜索树的性质:左子树小于根节点的值*/
17         int i;
18         //找到第一个大于根节点的值的下标i
19         for(i = L; i < R; ++i) {
20             if(postorder[i] > postorder[R]) {
21                 break;
22             }
23         }
24 
25         /*右子树大于根节点的值*/
26         for(int j = i+1; j < R; ++j) {
27             if(postorder[j] < postorder[R])
28                 return false;
29         }
30 
31         //递归检查左右子树是否满足二叉搜索树的性质
32         return check(postorder, L, i-1) && check(postorder, i, R-1);
33     }
34 };
复制代码

 

复杂度分析#

时间复杂度 O(N^2): 每次递归调用都减去一个根节点,因此递归占用 O(N) ;最差情况下(即当树退化为链表),每轮递归都需遍历树所有节点,占用 O(N) 。
空间复杂度 O(N) : 最差情况下(即当树退化为链表),递归深度将达到 N 。

 

方法二:辅助栈#

面试题33. 二叉搜索树的后序遍历序列(递归分治 / 单调栈,清晰图解)

递归和栈两种方式解决,最好的击败了100%的用户

 

 

posted @   拾月凄辰  阅读(69)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2019-11-01 Devc++读取不了当前目录下的文件的解决方法
点击右上角即可分享
微信分享提示
主题色彩