持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
前言
今天的题目为简单,比较常见的遍历二叉树的题目,题目除了通过递归还有另一种迭代的解法,本文主要使用的是递归解法。
每日一题
今天的题目是 1022. 从根到叶的二进制数之和,难度为简单
-
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
-
例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。 对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
-
返回这些数字之和。题目数据保证答案是一个 32 位 整数。
示例 1:
输入:root = [1,0,1,0,1,0,1]
输出:22
解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22
示例 2:
输入:root = [0]
输出:0
提示:
- 树中的节点数在 [1, 1000] 范围内
- Node.val 仅为 0 或 1
题解
递归
通过递归去深度优先遍历二叉树,也就是前序遍历,遍历的顺序刚好能够满足题目的要求,然后获取到每一个节点的值,这里获取每一个节点的值并且拼接的方法有两种,一种是直接用字符串拼接,之后转化为数字,另一种是获取数字,然后每次都左移一位。这里使用的是字符串拼接的方法, Number.parseInt 方法也能够提供给我们二进制的转化。
然后就是递归的考虑,通过先遍历左孩子,不存在左孩子再去遍历右孩子的方法能够比较轻松的得到所有的排列组合,并且在不存在左孩子和右孩子的时候,说明到了根节点的位置,那就需要进行二进制的转化,并且保存下每一个的值相加起来,最后就能够得到答案。
/**
* @param {TreeNode} root
* @return {number}
*/
var sumRootToLeaf = function(root) {
let res = 0
const dfs = function (node, val) {
if(!node) return
val += `${ node.val }`
if(!node.left && !node.right) {
res += Number.parseInt(val, 2)
}
dfs(node.left, val)
dfs(node.right, val)
}
dfs(root, '')
return res
};