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

描述

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

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

数据范围: 节点数量 0≤n≤1000 ,节点上的值满足 1≤val≤105保证节点上的值各不相同

提示:

1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。

2.该题我们约定空树不是二叉搜索树

3.后序遍历是指按照 "左子树-右子树-根节点" 的顺序遍历

方法:逆序遍历+栈

思路:

后序遍历的顺序是:左子树 ---> 右子树 ---> 根节点。那么其逆序便为:根节点 ---> 右子树 ---> 左子树。我们逆序遍历,如果是后一个节点大于前一个节点,说明后一个节点是前一个节点的右节点。并且我们每遍历一个节点就将其压入栈中。当我们发现后一个节点小于前一个节点,说明前一个节点没有右节点了,并且后一个节点是前一个节点(或者前一个节点的父节点)的左节点,那么我们就通过栈找到后一个节点的父节点,并且以后的节点都只能比这个节点小。

具体实现及注释:

java 复制代码
import java.util.*;
public class Solution {

   public boolean VerifySquenceOfBST(int [] sequence) {
       int length = sequence.length;
       //空树不是二叉搜索树
       if (length == 0) return false;
       //实例化栈
       Deque<Integer> stack = new ArrayDeque<>();
       //初始化根节点,因为树中最大值为100000,所以初始化一个最大虚拟值,相当于把原树的根节点作为此虚拟节点的左节点。
       int rootValue = 100001;
       for (int i = length-1; i >= 0; i--) {
           int curValue = sequence[i];
           //因为rootValue存的是根节点的值,而curValue一定在其左子树,所以当curValue大于rootValue时,说明其不是二叉搜索树。
           if (curValue > rootValue) return false;
           //当curValue小于其前一个节点时,说明curValue不是其前一个节点的右节点,我们通过栈找到curValue的父节点,并更新rootValue
           while (!stack.isEmpty() && curValue < stack.peek()) {
               rootValue = stack.pop();
           }
           stack.push(curValue);
       }
       return true;
   }
}
相关推荐
历程里程碑2 小时前
LeetCode热题11:盛水容器双指针妙解
c语言·数据结构·c++·经验分享·算法·leetcode·职场和发展
想不明白的过度思考者2 小时前
Spring Boot 配置文件深度解析
java·spring boot·后端
_OP_CHEN2 小时前
【C++数据结构进阶】从B + 树 / B * 树到数据库索引:B树的进化之路与 MySQL 实战解析
数据结构·数据库·b树·mysql·innodb·b+树·mylsam
第二只羽毛2 小时前
Java图书管理系统的设计与实现
java·大数据·安全·系统安全
cike_y7 小时前
Mybatis之解析配置优化
java·开发语言·tomcat·mybatis·安全开发
是一个Bug8 小时前
Java基础50道经典面试题(四)
java·windows·python
Slow菜鸟8 小时前
Java基础架构设计(三)| 通用响应与异常处理(分布式应用通用方案)
java·开发语言
wadesir8 小时前
Rust中的条件变量详解(使用Condvar的wait方法实现线程同步)
开发语言·算法·rust
我是Superman丶8 小时前
《Spring WebFlux 实战:基于 SSE 实现多类型事件流(支持聊天消息、元数据与控制指令混合传输)》
java
廋到被风吹走9 小时前
【Spring】常用注解分类整理
java·后端·spring