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

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

验证二叉搜索树

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

相关推荐
FakeOccupational3 小时前
【数学 密码学】量子通信:光的偏振&极化的量子不确定性特性 + 量子密钥分发 BB84算法步骤
算法·密码学
呱牛do it4 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 3)
java·vue
ZhengEnCi5 小时前
S10-蓝桥杯 17822 乐乐的积木塔
算法
神の愛5 小时前
左连接查询数据 left join
java·服务器·前端
贾斯汀玛尔斯5 小时前
每天学一个算法--拓扑排序(Topological Sort)
算法·深度优先
大龄程序员狗哥6 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
exp_add36 小时前
质数相关知识
算法
南境十里·墨染春水6 小时前
linux学习进展 线程同步——互斥锁
java·linux·学习
雨奔6 小时前
Kubernetes 联邦 Deployment 指南:跨集群统一管理 Pod
java·容器·kubernetes
杨凯凡6 小时前
【021】反射与注解:Spring 里背后的影子
java·后端·spring