本文最后更新于:2023年3月19日 晚上
Lt129.求根到叶子节点数字之和、dfs、回溯、二叉树
给定一个二叉树,它的每个结点都存放一个 0-9
的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3
代表数字 123
。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
1 2 3 4 5 6 7 8 9
| 输入: [1,2,3] 1 / \ 2 3 输出: 25 解释: 从根到叶子节点路径 1->2 代表数字 12. 从根到叶子节点路径 1->3 代表数字 13. 因此,数字总和 = 12 + 13 = 25.
|
示例 2:
1 2 3 4 5 6 7 8 9 10 11 12
| 输入: [4,9,0,5,1] 4 / \ 9 0 / \ 5 1 输出: 1026 解释: 从根到叶子节点路径 4->9->5 代表数字 495. 从根到叶子节点路径 4->9->1 代表数字 491. 从根到叶子节点路径 4->0 代表数字 40. 因此,数字总和 = 495 + 491 + 40 = 1026.
|
思路
数组做法-深度遍历加回溯
使用一个临时数组作为存储一条从根节点到叶子节点的路径,当是叶子节点时,将数组结果加入结果数组中。遍历过程中使用回溯法,遍历完当前一条路线后,出栈上一个叶子节点,判断下一条路径,避免反复添加。
非数组
遍历时多传入一个值,记录之前所有节点组成的数字,当是叶子节点时 sum 加上该数。避免使用了数组,也不需要进行回溯,降低了空间复杂度。
解答
数组做法-深度遍历加回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
var sumNumbers = function (root) { if (!root) return 0; const res = []; const temp = []; const dfs = (root) => { if (!root) return; temp.push(root.val); if (!root.left && !root.right) { res.push(Number(temp.join(""))); return; } if (root.left) { dfs(root.left); temp.pop(); } if (root.right) { dfs(root.right); temp.pop(); } }; dfs(root); return res.reduce((a, b) => a + b); };
|
非数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
var sumNumbers = function (root) { let sum = 0; const dfs = (root, value) => { if (!root) return; let temp = value * 10 + root.val; if (!root.left && !root.right) { sum += temp; return; } if (root.left) dfs(root.left, temp); if (root.right) dfs(root.right, temp); }; dfs(root, 0); return sum; };
|