Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

    • 102.二叉树的层序遍历
    • 103.二叉树的锯齿形层序遍历
    • 124.二叉树中的最大路径和
    • 236.二叉树的最近公共祖先
    • 105.从前序与中序遍历序列构造二叉树
    • 662.二叉树最大宽度
    • 1080. 根到叶路径上的不足节点
    • 101. 对称二叉树
    • 226. 翻转二叉树
    • 114. 二叉树展开为链表
    • 1110. 删点成林
    • 337. 打家劫舍 III
    • 979. 在二叉树中分配硬币
    • 222. 完全二叉树的节点个数
    • 513. 找树左下角的值
    • 968. 监控二叉树
    • 剑指offer34
    • 剑指 Offer 32 - III. 从上到下打印二叉树 III
    • 剑指 Offer 33. 二叉搜索树的后序遍历序列
      • 1.递归
    • 线索二叉树

    • 二叉搜索树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 二叉树
phan
2023-06-20
目录

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

# 剑指 Offer 33. 二叉搜索树的后序遍历序列 (opens new window)

# 1.递归

分析:先从树的本身定义与后序遍历出发,划分根节点、左子树、右子树,根节点一定在子数组的右边界。然后再分别遍历左子树和右子树,与根节点比较,判断是否符合二叉搜索树定义。

具体来说,找到根节点后,左边子节点存在以下几种情况:

  • 根节点左边第一个元素小于根节点,说明右子树为空。只要中间左子树有一个节点大于根节点返回false。
  • 根节点左边第一个元素大于根节点,根节点左侧相邻大于根节点的最大连续子数组为右子树。剩余左侧部分为左子树。
class Solution {
    public boolean verifyPostorder(int[] postorder) {
        if(postorder.length==0) return true;
        return dfs(postorder,0,postorder.length-1);
    }
    public boolean dfs(int[] postorder,int start,int end){
        if(start==end) return true;
        int root=postorder[end],right=-1;
        int mid=-1;
        if(postorder[end-1]>root){
            //找到右子树,并判断左子树合法性
            for(int i=end-1;i>=start;i--){
                if(postorder[i]<root){
                    mid=i;
                    for(int j=i-1;j>=start;j--){
                        if(postorder[j]>root) return false;
                    }
                    break;
                }
            }
            if(mid==-1){
                return dfs(postorder,start,end-1);
            }
            return dfs(postorder,start,mid)&&dfs(postorder,mid+1,end-1);
        }
        else{
            for(int i=end-1;i>=start;i--){
                if(postorder[i]>root) return false;
            }
            return dfs(postorder,start,end-1);
        }
        
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
编辑 (opens new window)
#Leetcode#二叉树
上次更新: 2023/12/15, 15:49:57
剑指 Offer 32 - III. 从上到下打印二叉树 III
94.二叉树中序遍历

← 剑指 Offer 32 - III. 从上到下打印二叉树 III 94.二叉树中序遍历→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式