开启我的LeetCode刷题日记:965. 单值二叉树

69 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今日题目: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);
};

总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹