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

LeetCode 二叉搜索树双神题通关!有序数组转平衡 BST + 验证 BST,小白递归一把梭

前言

二叉搜索树(BST)是算法刷题的高频必考知识点!今天给大家带来两道最经典、最基础的 BST 题目,全程用最简单的递归实现,代码干净、思路直白,不用死记硬背,看完就能直接写!

一道教你构建平衡二叉搜索树,一道教你验证一棵树是不是合法 BST,两道题搭配学习,直接拿捏 BST 核心逻辑!


第一题:将有序数组转换为二叉搜索树

🎯 题目要求

给你一个升序排列的数组,把它转换成一棵高度平衡的二叉搜索树。平衡树的规则:每个节点的左右子树高度差不超过 1;BST 的规则:左子树节点值 < 根节点值 < 右子树节点值。

💡 小白秒懂思路

数组已经是升序的了,这简直是送分题!核心逻辑:二分法 + 递归

  1. 取数组中间元素作为根节点(保证树平衡)
  2. 中间左边的元素 → 递归构建左子树(全是小值)
  3. 中间右边的元素 → 递归构建右子树(全是大值)
  4. 递归结束,一棵完美的平衡 BST 就建好了!

✅ 完整解题代码

/** * 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 TreeNode sortedArrayToBST(int[] nums) { //使用二分法来做,找到中间节点 int left = 0; int right = nums.length - 1; return travle(nums, left, right); } // 递归函数:在[left,right]区间构建子树 public TreeNode travle(int []nums, int left, int right){ // 递归终止条件:区间无效,返回空 if(left > right) return null; //找到中间节点,作为根 int mid = (left + right) / 2; TreeNode node = new TreeNode(nums[mid]); //小的元素构建左子树 node.left = travle(nums, left, mid - 1); //大的元素构建右子树 node.right = travle(nums, mid + 1, right); return node; } }

📝 代码超通俗解析

  1. 定义左右指针,锁定当前要处理的数组区间
  2. 取中点做根,保证左右子树节点数量均衡,树天然平衡
  3. 左区间递归生成左子树,右区间递归生成右子树
  4. 满足 BST「左小右大」的规则,一行多余代码都没有!

第二题:验证二叉搜索树

🎯 题目要求

给定一棵二叉树,判断它是否是合法的二叉搜索树

💡 小白秒懂思路

BST 有一个铁律中序遍历的结果一定是严格升序的!所以解题方法超级简单:

  1. 对树做中序遍历(左→根→右)
  2. 把遍历的节点值收集到集合里
  3. 遍历集合,判断是不是严格递增
  4. 是→合法 BST,否→不合法

✅ 完整解题代码

java

运行

/** * 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 { // 收集中序遍历结果 List<Integer> list = new ArrayList<>(); public boolean isValidBST(TreeNode root) { //直接使用中序遍历,收集所有节点值 travle(root); //遍历集合,若不是升序,返回false for(int i = 0; i < list.size() - 1; i++){ if(list.get(i) >= list.get(i + 1)) return false; } return true; } // 中序遍历:左→根→右 public void travle(TreeNode node){ if(node == null) return ; travle(node.left); list.add(node.val); travle(node.right); } }

📝 代码超通俗解析

  1. 中序遍历二叉树,将节点值按顺序存入集合
  2. 遍历集合,只要出现后一个数 ≤ 前一个数,就不是 BST
  3. 全程无复杂逻辑,纯遍历 + 判断,小白也能一遍写对!

🎉 两道题终极总结(口诀记忆)

有序数组转平衡 BST

二分找中点,中点做根节点;左递归左子树,右递归右子树

验证二叉搜索树

中序遍历收集值,严格递增就是对

http://www.jsqmd.com/news/584177/

相关文章:

  • 2026年比较好的纯三层实木拼花地板深度厂家推荐 - 品牌宣传支持者
  • OpenClaw技能开发指南:为SecGPT-14B定制专属安全检测模块
  • Unity Package Manager从入门到精通:除了导入Asset Store,你还能这样玩转自定义插件
  • OpenClaw极简配置:Gemma-3-12b-it单文件部署方案(无需Node环境)
  • 机器学习(1)快速搭建Pytorch开发环境
  • 从传统部署到云原生的迁移策略
  • 2.5MW ANPC拓扑储能变流器PCS整流器仿真搭建之旅
  • 机械键盘防抖优化指南:提升输入稳定性的完整解决方案
  • LLCOM串口调试工具:Lua脚本驱动的自动化实践
  • 保姆级教程:在Vitis HLS 2022.2中配置Vision库和OpenCV 4.4.0(附完整编译参数)
  • (开头直接进入主题,无废话)
  • LlamaFactory实战:5分钟搞定LoRA微调,让你的大模型秒变中文专家
  • OpenClaw网络优化:Qwen3.5-9B模型响应加速方案
  • 5大优势+零基础指南:开源字体思源宋体商用全攻略
  • 2026年评价高的承重停车棚厂家精选合集 - 品牌宣传支持者
  • 法律文书专家:OpenClaw+Qwen3.5-9B合同审查自动化
  • Airtest+Poco自动化测试避坑指南:从环境搭建到报告生成的10个常见问题
  • 从噪声数据中提取系统矩阵(对应论文式3)
  • 复利
  • 微信单向好友检测终极指南:三步快速找出谁删了你
  • 基于差分进化算法DE的机器人山地路径规划探索
  • 从DIN到Transformer:手把手教你用TensorFlow 2.x实现推荐系统中的Attention机制
  • 嵌入式系统定时与超时机制设计实战
  • 基于AMESim 2021.2打造商用车热泵系统仿真模型
  • Ubuntu20.02使用nginx
  • 卖了一年才想明白
  • C++ constexpr 模板在编译期的应用
  • 嵌入式工程师的中年危机与转型策略
  • STM32CubeIDE + LAN8720A + lwIP实战:手把手教你搞定UDP组播通讯(附避坑代码)
  • ARM嵌入式开发中的总线错误分析与解决