持续创作,加速成长!这是我参与「掘金日新计划 · 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。这道题还是使用递归的方式解决。
解题
首先来考虑递归的三要素:
- 参数和返回值
这道题的参数有两个,一个是节点值,一个是目标值。返回值为是否找到目标值,类型为布尔值。
- 终止条件
我们采取用目标值减去节点值的方式,当遍历到叶子节点时,目标值减为0,则返回true,否则返回false。
- 单层循环的逻辑
单层递归循环遍历左节点和右节点,以便遍历出所有的路径。
代码如下:
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);
};
总结
这两道题有很多种解法,但是我目前只理解了一种。以后还需要努力理解多种解法。