2024-08-08

题目描述:

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,从左至右的顺序,逐层返回各层的节点值)。

示例:

输入:[3,9,20,null,null,15,7]

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

解法1:广度优先搜索(BFS)

使用队列进行层次遍历,每一层的节点放在一个列表中,最后的结果再倒序。




/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
 
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
 
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
 
        while (!queue.isEmpty()) {
            List<Integer> level = new ArrayList<>();
            int currentLevelSize = queue.size();
            for (int i = 0; i < currentLevelSize; i++) {
                TreeNode node = queue.poll();
                level.add(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            result.add(level);
        }
 
        // 最后一步:倒序结果
        Collections.reverse(result);
        return result;
    }
}

这段代码首先定义了一个二叉树节点类TreeNode,然后在levelOrderBottom方法中,使用了一个队列来进行层次遍历,每次将当前层的节点值添加到列表中,最后将结果列表倒序。这样就得到了从底层到顶层的层次遍历结果。

2024-08-08



/* 设置一个容器使用伸缩布局 */
.container {
  display: flex; /* 设置为伸缩容器 */
  flex-direction: row; /* 默认值,子元素在主轴(水平)排列 */
  justify-content: flex-start; /* 子元素向主轴起始方向对齐 */
  align-items: center; /* 子元素在交叉轴上居中对齐 */
  height: 100px; /* 容器高度 */
  background-color: lightblue; /* 容器背景色 */
}
 
/* 设置子元素 */
.item {
  margin: 10px; /* 子元素间隔 */
  padding: 10px; /* 子元素内填充 */
  background-color: salmon; /* 子元素背景色 */
}
 
/* 设置特定子元素的样式 */
.item:nth-child(2) {
  flex-grow: 1; /* 第二个子元素会占据容器中的可用空间 */
  background-color: lightgreen; /* 子元素背景色 */
}
 
/* 设置第三个子元素的样式 */
.item:nth-child(3) {
  flex-shrink: 2; /* 第三个子元素在空间不足时会缩小 */
  background-color: lightcoral; /* 子元素背景色 */
}

这段代码展示了如何使用CSS的伸缩布局(flexbox)来创建一个简单的布局。它设置了一个容器和几个子元素,并使用了伸缩布局的一些关键属性,如flex-growflex-shrink。这有助于理解伸缩布局的基本概念,并能为初学者提供一个实践的例子。

2024-08-04

在JavaScript中,Array、Set和Map是三种常用的数据结构,它们各自具有独特的特性和用法。

Array(数组)

数组是一种线性数据结构,用于存储一系列有序的元素。在JavaScript中,数组可以包含任意类型的元素,且元素的索引从0开始。

特性

  • 有序:数组中的元素按照索引顺序排列。
  • 可重复:数组中可以包含重复的元素。
  • 动态大小:数组的大小可以在运行时动态调整。

用法

  • 创建数组:let arr = [1, 2, 3, 4, 5]; 或者 let arr = new Array(1, 2, 3, 4, 5);
  • 访问元素:通过索引访问,如 arr[0] 返回数组的第一个元素。
  • 添加/删除元素:使用push()pop()shift()unshift()等方法。
  • 遍历数组:可以使用for循环、forEach()map()等方法。

Set(集合)

集合是一种不包含重复元素的数据结构。在JavaScript中,Set对象用于存储唯一值的集合。

特性

  • 无序:集合中的元素没有特定的顺序。
  • 唯一性:集合中每个元素只出现一次。

用法

  • 创建集合:let set = new Set([1, 2, 3, 4, 5]);
  • 添加元素:set.add(6);
  • 删除元素:set.delete(3);
  • 检查元素是否存在:set.has(4);
  • 遍历集合:可以使用for...of循环或Set.prototype.forEach()方法。

Map(映射)

映射是一种存储键值对的数据结构。在JavaScript中,Map对象用于保存具有唯一键的键值对。

特性

  • 键值对:每个元素都由一个键和一个值组成。
  • 键的唯一性:每个键在映射中只出现一次。
  • 可迭代:可以使用迭代方法遍历映射中的元素。

用法

  • 创建映射:let map = new Map();
  • 设置键值对:map.set('key', 'value');
  • 获取值:let value = map.get('key');
  • 删除键值对:map.delete('key');
  • 检查键是否存在:map.has('key');
  • 遍历映射:可以使用for...of循环结合Map.prototype.entries()方法,或者使用Map.prototype.forEach()方法。