前言
“这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战”
- NC5 二叉树根节点到叶子节点的所有路径和(中等)
根节点到叶子节点的所有路径和
描述 : 给定一个仅包含数字 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。 例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用123 来代替。 找出根节点到叶子节点的所有路径表示的数字之和 例如:
这颗二叉树一共有两条路径, 根节点到叶子节点的路径 1→2 用数字 12 代替 根节点到叶子节点的路径 1→3 用数字 13 代替 所以答案为 12+13=25
思路分析:
-
递归实现,二叉树相关的题目一般都可以用递归去实现 定义递归函数 明确递归函数的意义 调用 help(TreeNode root, int val) 函数 可以返回从 root 节点出发,当前值为val的情况下 到叶子节点的路径之和 base case 当前为 叶子节点 返回 val 左子节点不为空时 递归调用 右子树同理
-
层级遍历 实现 复用之前层级遍历的代码, 多准备一个 List 记录对应节点的 val 在遍历过程中同步 处理 队列 和 list 集合 当前 遍历到的节点为 叶子节点时 更新最后的返回值
AC 代码:
DFS 实现版本
public int sumNumbers (TreeNode root) {
// write code here
if(root == null){
return 0;
}
return help(root, root.val);
}
int help(TreeNode root, int val){
if(root.left == null && root.right == null){
return val;
}
int ans = 0;
if(root.left != null){
ans+= help(root.left, val * 10 + root.left.val);
}
if(root.right != null){
ans+= help(root.right, val * 10 + root.right.val);
}
return ans;
}
BFS 的实现版本
public int sumNumbers (TreeNode root) {
if(root == null){
return 0;
}
// write code here
Queue<TreeNode> queue = new LinkedList<>();
int ans = 0;
List<Integer> temp = new ArrayList<>();
queue.offer(root);
temp.add(root.val);
while (!queue.isEmpty()) {
int size = queue.size();
while (size-- > 0) {
TreeNode cur = queue.poll();
int val = temp.remove(0);
if (cur.left != null) {
queue.offer(cur.left);
temp.add(val * 10 + cur.left.val);
}
if (cur.right != null) {
queue.offer(cur.right);
temp.add(val * 10 + cur.right.val);
}
if (cur.left == null && cur.right == null) {
ans +=val;
}
}
}
return ans;
}