开幕式焰火
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 30 ms, 内存: 16.4 MB
/*
题目思路:
使用Java Stream API来解决此问题。
具体步骤如下:
1. 将二叉树节点值收集到一个List中。
2. 使用Stream去重并统计不同的颜色种类数。
*/
import java.util.*;
import java.util.stream.Collectors;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class FireworkColorsStream {
public int numOfColors(TreeNode root) {
List<Integer> colors = new ArrayList<>();
collectColors(root, colors);
return colors.stream().collect(Collectors.toSet()).size();
}
private void collectColors(TreeNode node, List<Integer> colors) {
if (node == null) return;
colors.add(node.val);
collectColors(node.left, colors);
collectColors(node.right, colors);
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(3);
root.right = new TreeNode(2);
root.left.left = new TreeNode(1);
root.right.left = new TreeNode(2);
FireworkColorsStream solution = new FireworkColorsStream();
System.out.println(solution.numOfColors(root)); // 输出: 3
}
}
解释
方法:
这个题解使用了深度优先搜索(DFS)来遍历整棵二叉树,并利用一个集合(set)来存储遍历过程中遇到的所有不同的节点值。通过这种方式,集合中的元素个数最终就是不同颜色的总数。首先,定义一个辅助函数dfs来递归遍历树的每一个节点。如果当前节点为空,则递归结束。否则,先递归遍历左子树,然后将当前节点的值添加到集合中,最后递归遍历右子树。这样可以确保每个节点都被访问一次。最后,返回集合中元素的数量,即为不同颜色的总数。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么选择使用深度优先搜索(DFS)而不是广度优先搜索(BFS)来解决这个问题?
▷🦆
集合(set)在这个算法中的作用是什么,它是如何帮助确定不同颜色的数量的?
▷🦆
在递归函数`dfs`中,如果二叉树非常深,是否会存在栈溢出的风险? 如何避免?
▷