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

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

验证二叉搜索树

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

相关推荐
项目帮2 小时前
Java毕设选题推荐:基于springboot区块链的电子病历数据共享平台设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
java·spring boot·课程设计
心有—林夕2 小时前
两个事务间的传播机制
java·事务
疯狂成瘾者2 小时前
什么是多 Agent,多Agent是如何协作的?
java
he___H2 小时前
Spring中的设计模式
java·spring·设计模式
liuyao_xianhui2 小时前
优选算法_最小基因变化_bfs_C++
java·开发语言·数据结构·c++·算法·哈希算法·宽度优先
做一个AK梦2 小时前
计算机系统概论知识点(软件设计师)
java·开发语言
黎阳之光3 小时前
数智技术如何赋能空天地一体化,领跑低空经济新赛道
大数据·人工智能·算法·安全·数字孪生
東雪木3 小时前
Java学习——一访问修饰符(public/protected/default/private)的权限控制本质
java·开发语言·学习·java面试
两点王爷3 小时前
docker 创建和使用存储卷相关内容
java·docker·容器