【树】129. 求根到叶子节点数字之和
题目:
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
解答:
方法一: DFS
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { int res = 0; public int sumNumbers(TreeNode root) { preOrder(root,0); return res; } public void preOrder(TreeNode root,int sum){ if(root == null) return; int curSum = sum; curSum =curSum*10 + root.val; if(root.left == null && root.right == null){ res += curSum; } preOrder(root.left,curSum); preOrder(root.right,curSum); } }
方法一的优化:
public int sumNumbers(TreeNode root) { return helper(root, 0); } public int helper(TreeNode root, int i){ if (root == null) return 0; int temp = i * 10 + root.val; if (root.left == null && root.right == null) return temp; return helper(root.left, temp) + helper(root.right, temp); }
方法二:BFS
public int sumNumbers(TreeNode root) { if(root == null){ return 0; } int res = 0; Queue<TreeNode> nodeQueue = new LinkedList<>(); Queue<Integer> numQueue = new LinkedList<>(); nodeQueue.add(root); numQueue.add(root.val); while(!nodeQueue.isEmpty()){ // 同时维护两个队列 TreeNode node = nodeQueue.poll(); int num = numQueue.poll(); // 如果该节点是叶子节点,加到res中 if(node.left==null && node.right==null){ res += num; } else { // 左节点不为空时,左节点进入队列,左节点对应的值是当前节点num*10+node.left.val if(node.left != null){ nodeQueue.add(node.left); numQueue.add(num*10 + node.left.val); } if(node.right != null){ nodeQueue.add(node.right); numQueue.add(num*10 + node.right.val); } } } return res; }

浙公网安备 33010602011771号