持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode
刷题之旅
第一阶段目标是:200
道,每天1
到2
篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今日题目:965. 单值二叉树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
示例 1:
输入:[1,1,1,1,1,null,1] 输出:true
示例 2:
输入:[2,2,2,5,2] 输出:false
提示:
给定树的节点数范围是 [1, 100]。 每个节点的值都是整数,范围为 [0, 99] 。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/un… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
题目要求判断节点数为n的二叉树内所有元素值是否一致,那么需要遍历二叉树。二叉树遍历有两种策略:
广度优先遍历(BFS),利用队列 深度优先遍历(DFS),利用递归 为了方便比较,我们先声明一个val变量存储根节点的值,后序遍历比对时直接以此为基准(题目中规定二叉树至少一个根结点,所以该值一定存在)
BFS 队列中维护二叉树每一层的节点,节点出队后检查值,并将其子节点入队
代码实现
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isUnivalTree = function (root) {
let q = [root],
val = root.val;
while (q.length) {
let node = q.shift();
if (node.val !== val) return false;
node.left && q.push(node.left);
node.right && q.push(node.right);
}
return true;
};
也可以
抽离递归函数
递归函数定义:参数为当前节点,返回值为该节点是否通过节点值检查 边界条件:当节点为空时,返回true 递归逻辑:当前节点通过检查,依赖于三个条件:1.自身值等于全局声明的val 2.左节点通过检查 3.右节点通过检查 对根结点调用递归函数
代码
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isUnivalTree = function (root) {
let val = root.val;
var check = function (node) {
if (!node) return true;
return node.val === val && check(node.left) && check(node.right);
};
return check(root);
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹