LeetCode 热题 100——二叉树——二叉树的层序遍历&将有序数组转换为二叉搜索树

二叉树的层序遍历

题目描述

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = 3,9,20,null,null,15,7

输出:\[3,9,20,15,7]

示例 2:

输入:root = 1

输出:\[1]

示例 3:

输入:root = \[\]

输出:\[\]

提示:

树中节点数目在范围 0, 2000

-1000 <= Node.val <= 1000

求解

一开始直接把节点 push 到ans中了,就报错了,应该是把相关节点放进去。

js 复制代码
var levelOrder = function(root) {
    if (!root) return [];
    let ans = [];
    let queue = [root];
    while (queue.length !== 0) {
        const levelSize = queue.length; // 当前层的节点数
        let temp = []; // 存节点的值,不是节点
        for (let i= 0; i < levelSize; i++) {
            let node = queue.shift();
            temp.push(node.val);
            if (node.left) queue.push(node.left);
            if (node.right) queue.push(node.right)
        }
        ans.push(temp);
    }
    return ans;
};

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

题目描述

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

示例 1:

输入:nums = -10,-3,0,5,9

输出:0,-3,9,-10,null,5

解释:0,-10,5,null,-3,null,9 也将被视为正确答案:

示例 2:

输入:nums = 1,3

输出:3,1

解释:1,null,33,1 都是高度平衡二叉搜索树。

提示:

1 <= nums.length <= 104

-104 <= numsi <= 104

nums 按 严格递增 顺序排列

求解

1. 二叉搜索树(BST)是什么?

二叉搜索树(Binary Search Tree,简称 BST),也叫二叉排序树,是一种满足特定规则的二叉树结构,核心特点是便于快速查找、插入、删除操作(平均时间复杂度为 O (logn))。

2. 二叉搜索树的核心规律(性质)

节点值的大小关系:

  • 左子树中所有节点的值都小于当前节点的值;

  • 右子树中所有节点的值都大于当前节点的值;

  • 每个子树本身也必须是一棵二叉搜索树(递归满足上述规则)。

示例:

plaintext 复制代码
     5
    / \
   3   7
  / \ / \
 2  4 6  8
  • 节点 5 的左子树(3、2、4)都小于 5,右子树(7、6、8)都大于 5;节点 3 的左子树(2)小于 3,右子树(4)大于 3,以此类推。
  • 中序遍历的特性对二叉搜索树进行中序遍历(左→根→右),得到的结果是严格升序的序列。比如上面的例子,中序遍历结果为:2 → 3 → 4 → 5 → 6 → 7 → 8,这是 BST 最关键的特性之一。
  • 唯一性(可选)若树中不允许重复值,则任意节点的左右子树值不会等于自身;若允许重复,通常约定重复值放在右子树(或左子树)。

3. 有序数组转二叉搜索树的思路

因为有序数组本身是 BST 的中序遍历结果,要转成 BST,需保证树的平衡性(避免退化成链表),通常采用二分法:

  • 取数组中间元素作为根节点(保证左右子树高度差≤1);
  • 左半部分数组递归构建左子树;
  • 右半部分数组递归构建右子树。

代码:

js 复制代码
var sortBST = function(nums, head, tail) {
    if (head > tail) return null;
    let mid = (head + tail) >> 1; // 选择中间位置左边的数字作为根节点
    // let mid = (head + tail + 1) >> 1; // 选择中间位置右边的数字作为根节点
    let root = new ListNode(nums[mid]);
    root.left = sortBST(nums, head, mid - 1);
    root.right = sortBST(nums, mid + 1, tail);
    return root;
};

var sortedArrayToBST = function(nums) {
    // 二分
    return sortBST(nums, 0, nums.length - 1)
};
相关推荐
Omics Pro1 小时前
Arc研究所Cell|全新虚拟细胞官方基准评测框架
大数据·人工智能·深度学习·算法·机器学习
CoderYanger3 小时前
A.每日一题:1140. 石子游戏 II
java·程序人生·算法·leetcode·游戏·职场和发展·深度优先
小雨笙笙3 小时前
机器学习:评估模型与选择
人工智能·算法·机器学习
高亦真3 小时前
今天是学习嵌入式的第35天
linux·学习·算法
HugoStudio_SWAN3 小时前
洛谷 P1319 / P1320 压缩技术——同一枚硬币的正反面
c++·学习·程序人生·算法
不要打扰7564 小时前
2027国网提前批宣讲、面试、预报名、内部笔试时间一览
面试·职场和发展
wdfk_prog5 小时前
canopennode-rtt推荐,不只可以做从站,也可以承担主站角色
c语言·开发语言·数据库·学习·算法·深度优先
BioRunYiXue6 小时前
科研干货 | IC50全面解读:概念解析、实验设计与数据分析要点
java·开发语言·javascript·人工智能·算法·数据挖掘·数据分析
hahaha60166 小时前
HLS高层次综合设计技巧--UART_TX接收模块设计案例
人工智能·算法·计算机视觉
302wanger6 小时前
一个程序员看完《逆行人生》:电影没说透的,比电影更扎心
算法