【LeetCodehot100】T108:将有序数组转换为二叉搜索树 T98:验证搜索二叉树

T108:将有序数组转换为二叉搜索树

题目要求:给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。

题目理解

输入一个升序数组nums

输出一棵"高度平衡"的二叉搜素树(BST)

核心思路

BST特点

左 < 根 < 右

所以我们必须

每次选中间元素当根节点

流程:

1️⃣ 找中点 mid

2️⃣ 创建 root = nums[mid]

3️⃣ 左子树 = build(left, mid-1)

4️⃣ 右子树 = build(mid+1, right)

代码实现

java 复制代码
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return build(nums, 0, nums.length - 1);
    }

    private TreeNode build(int[] nums, int left, int right) {
        // 终止条件
        if (left > right) {
            return null;
        }

        // 正确的中点
        int mid = left + (right - left) / 2;

        // 创建节点
        TreeNode root = new TreeNode(nums[mid]);

        // 左子树
        root.left = build(nums, left, mid - 1);

        // 右子树
        root.right = build(nums, mid + 1, right);

        return root;
    }
}
}

本题感悟

  1. 掌握升深度搜素树的概念:左<根节点<右
  2. 深入递归思想

T98:验证搜索二叉树

题目要求

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 严格小于 当前节点的数。

节点的右子树只包含 严格大于 当前节点的数。

所有左子树和右子树自身必须也是二叉搜索树。

本质理解

BST定义

对于每个节点:
左子树所有节点 < 当前节点
右子树所有节点 > 当前节点

核心思路

中序遍历

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 {
    long prev=Long.MIN_VALUE;//记录上一个值
    public boolean isValidBST(TreeNode root) {
        return inorder(root);
    }
        private boolean inorder(TreeNode node){
            if(node==null){
                return true;
            }
            //递归调用左子树
            if(!inorder(node.left)){
                return false;
            }
            //中(判断)
            if(node.val<=prev){
                return false;
            }
            prev=node.val;
            //递归调用右子树
            return inorder(node.right);
        }
    
}

本题感悟

被二叉树递归绕的晕晕的

相关推荐
_日拱一卒9 小时前
LeetCode:543二叉树的直径
算法·leetcode·职场和发展
jieyucx9 小时前
Go 数据结构入门:线性表、顺序表、链表
数据结构·链表·golang
汉克老师9 小时前
GESP2025年3月认证C++五级( 第一部分选择题(9-15))
c++·算法·高精度计算·二分算法·gesp5级·gesp五级
穿条秋裤到处跑9 小时前
每日一道leetcode(2026.04.28):获取单值网格的最小操作数
算法·leetcode·职场和发展
阿维的博客日记9 小时前
zset为什么要用到skiplist+Dict的数据结构
数据结构·skiplist
leoufung9 小时前
LeetCode 68. Text Justification 题解:贪心与实现细节
算法·leetcode·职场和发展
WL_Aurora10 小时前
【每日一题】前缀和
python·算法
汉克老师10 小时前
GESP2025年3月认证C++五级( 第二部分判断题(1-10))
c++·算法·分治算法·线性筛法·gesp5级·gesp五级
洛水水10 小时前
【力扣100题】17.K 个一组翻转链表
算法·leetcode·链表
洛水水11 小时前
【力扣100题】16.两两交换链表中的节点
算法·leetcode·链表