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

验证二叉搜索树

验证二叉搜索树

https://leetcode.cn/problems/validate-binary-search-tree/description/?envType=study-plan-v2&envId=top-100-liked

LeetCode98:验证二叉搜索树

请添加图片描述

先说考点:递归

我的理解是,要掌握递归,首先要掌握两个关键点

  1. 递归是用来处理重复结构的问题
  2. 用好递归要有大局观,不能只看眼前
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isValidBST(TreeNode root) {return isValid(root,Long.MIN_VALUE,Long.MAX_VALUE);}boolean isValid(TreeNode node,long min,long max){if(node==null){return true;}if(node.val<=min||node.val>=max){return false;}return isValid(node.left,min,node.val)&&isValid(node.right,node.val,max);}
}

本质

递归是一种将"大问题"等价拆解"为小问题,并通过自身调用自身来解决问题的思维方式.

递归三要素

要素含义
1. 终止条件什么时候不再调用自身(递归停止)避免无限递归,最常见是:if (node == null) return ...
2. 递归调用函数自己调用自己,把问题不断变小(往子结构“深入”)
3. 返回与组合如何用子问题的结果构造当前问题的答案(通常是 return ... + ... / 合并左右子树结果

那什么时候适合用递归呢?

灵魂两问

问题意义
问题是否具有自相似结构?比如:树、链表、数组分割等
当前问题能否被分解为子问题,并组合子问题的结果?如果能,用递归就对了

常见的适用于递归的场景

场景示例题特征
树的遍历前中后序、判断 BST、树深度等子结构 = 子树
分治类算法快排、归并、二分、汉诺塔拆成两个子问题
回溯全排列、组合、数独穷举+剪枝
动态规划(自顶向下)斐波那契、背包问题用备忘录剪枝
图的 DFS/BFS岛屿数量、染色问题、拓扑排序等图结构递归遍历

如何找到递归的终止条件?

方法一:从结构上找“底层单位”

  • 树:当节点为 null,表示到了叶子节点底部
  • 数组:当索引越界或只有一个元素
  • 数:当 n == 1 或 n == 0
  • 回溯:当字符串走完 / 组合长度达到目标

方法二:从目标分解角度反推“不能再分的情况”

比如:

  • 我要从 n 个数字中选出 k 个
  • 当,当前组合长度达到 k,就不能再选了(递归终止)

递归模版

// 返回类型可以是 boolean、int、List 等
ReturnType recur(参数...) {// 1. 终止条件if (满足结束条件) {return 结果;}// 2. 递归调用,处理子结构ReturnType left = recur(子问题1);ReturnType right = recur(子问题2);// 3. 合并结果,或做逻辑判断return 合并(left, right);
}

谈回此题目

元素实现
终止条件if (node == null) return true;
子问题拆解验证左子树和右子树
递归参数min, max 来定义合法范围
返回结果组合方式左子树是否合法 && 右子树是否合法

总结:掌握递归的 4 步策略

步骤行动
识别是否能递归结构是否可拆?子问题能组合?
明确终止条件到底部 / 组合完成 / 无法再分
写出递归调用找出下一层的“子结构”传进去
合并结果看清返回值 → 是 boolean / 数字 / 集合 → 决定怎么组合

春景祥云

http://www.xdnf.cn/news/1281979.html

相关文章:

  • 【PRML】分类
  • CI/CD渗透测试靶场
  • 分享一款基于STC32G12K128单片机的螺丝机供料器控制板 ES-IO2422 S4
  • 深入解析Linux poll()系统调用
  • 内网依赖管理新思路:Nexus与CPolar的协同实践
  • 自动化备份全网服务器数据平台项目
  • 深入理解Android Kotlin Flow:响应式编程的现代实践
  • 《算法导论》第 18 章 - B 树
  • 银河通用招人形机器人强化学习算法工程师了
  • openEuler、 CentOS、Ubuntu等 Linux 系统中,Docker 常用命令总结
  • MySQL-锁
  • MySQL数据库简介
  • 安装AI高性能推理框架llama.cpp
  • AR 智能眼镜:从入门到未来
  • 5G与云计算对代理IP行业的深远影响
  • Unknown collation: ‘utf8mb4_0900_ai_ci‘
  • ROS2学习(1)—基础概念及环境搭建
  • FinQ4Cn: 基于 MCP 协议的中国 A 股量化分析
  • P2865 [USACO06NOV] Roadblocks G
  • 第2节 PyTorch加载数据
  • 3.数据类型和类型装换
  • 爬虫和数据分析相结合案例
  • 安全合规4--下一代防火墙组网
  • 强化学习常用数据集
  • 【11-计算机视觉介绍】
  • RAG所存在的问题和解决方案
  • 贪心----3. 跳跃游戏 II
  • 2438. 二的幂数组中查询范围内的乘积
  • 零基础AI编程开发微信小程序赚流量主广告实战
  • MySQL高可用改造之数据库开发规范(大事务与数据一致性篇)