持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 12 天,点击查看活动详情
题目链接
题目描述
「力扣挑战赛」开幕式开始了,空中绽放了一颗二叉树形的巨型焰火。 给定一棵二叉树 root 代表焰火,节点值表示巨型焰火这一位置的颜色种类。请帮小扣计算巨型焰火有多少种不同的颜色。
测试用例
示例 1:
输入:`root = [1,3,2,1,null,2]`
输出:`3`
解释:焰火中有 3 个不同的颜色,值分别为 1、2、3
限制
1 <= 节点个数 <= 10001 <= Node.val <= 1000
题目分析
题目需要我们求二叉树中,出现的不同的元素的个数,一个典型的去重题目
一般,涉及到去重的,我们都可以直接上 Set,原理是 Set 内部会用 hashcode 的方式去判断两个元素是否相等。并且,重复的元素,是不会再次存入 Set 内部的
老规矩,声明一个 Set 类型的变量 count,然后对树进行标准的前序遍历,我们将当前节点的值,添加到 count;当整个树遍历完后, count 中元素的个数,就是题目所求
拓展:
通过 Set 我们仅仅知道出现过哪些元素,但我们切换为 Map 结构,key 存放元素的值,val 存放对应元素出现的次数,这样,我们在拿到题目所需的答案的时候,也知道各个元素重复的次数
代码实现
完整的代码实现如下
var numColor = function(root) {
let count = new Set();
trave(root);
return count.size;
function trave(node) {
if (node == null) return;
count.add(node.val);
trave(node.left);
trave(node.right);
}
};
方法2
对题目的整理,发现可以 Array 来优化,依据是 Set 结构每次存入元素的时候,都需要计算元素的 hashcode 判断是否重复出现过;但用 Array 的话,我们直接初始化一个长度为 1001 的数组 arr,arr 中的元素初始值为 0,然后每次遍历树的节点,直接将 arr 对应的下标改为 1 即可。最后对 arr 全部元素求和,完事
var numColor = function(root) {
let arr = new Array(1000).fill(0);
trave(root);
return arr.reduce((a, b) => a + b, 0);
function trave(node) {
if (node == null) return;
arr[node.val] = 1;
trave(node.left);
trave(node.right);
}
};