代码随想录算法训练营第十八天 | 513.找树左下角的值、112. 路径总和

83 阅读2分钟

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

513.找树左下角的值

题目解析

题目要求求出二叉树,最底层最左边节点的值。这道题最简单的方式就是用层序遍历的方式来解决问题。通过程序遍历,从右向左遍历,最后一个就是二叉树最底层,最左边的节点。

解题

前面我们说过层序遍历的方式,通过维护一个队列,来实现二叉树的遍历。这道题由于不需要求出完整的层序遍历,所以可以简化。

代码如下:

var findBottomLeftValue = function(root) {
     let res = 0,queue = [root]
     while(queue.length) {
         const node = queue.shift()
         node.right && queue.push(node.right)
         node.left && queue.push(node.left)
         res = node.val
     }
     return res
};

112. 路径总和

题目解析

本题给出二叉树和一个表示目标和的整数,判断二叉树中是否存在根节点到叶子节点的路径路径上,节点值相加等于目标和,如果存在返回true,否则返回false。这道题还是使用递归的方式解决。

解题

首先来考虑递归的三要素:

  1. 参数和返回值

这道题的参数有两个,一个是节点值,一个是目标值。返回值为是否找到目标值,类型为布尔值。

  1. 终止条件

我们采取用目标值减去节点值的方式,当遍历到叶子节点时,目标值减为0,则返回true,否则返回false。

  1. 单层循环的逻辑

单层递归循环遍历左节点和右节点,以便遍历出所有的路径。

代码如下:

var hasPathSum = function(root, targetSum) {
    const traversal = (node, cnt) => {
    if (cnt === 0 && !node.left && !node.right) return true;
    if (!node.left && !node.right) return false;
    if (node.left && traversal(node.left, cnt - node.left.val)) return true;
    if (node.right && traversal(node.right, cnt - node.right.val)) return true;
    return false;
  };
  if (!root) return false;
  return traversal(root, targetsum - root.val);
};

总结

这两道题有很多种解法,但是我目前只理解了一种。以后还需要努力理解多种解法。