Given a binary tree containing digits from 0-9
only, each root-to-leaf path could represent a number.
An example is the root-to-leaf path 1->2->3
which represents the number123
.
Find the total sum of all root-to-leaf numbers.
For example,
1 / \ 2 3
The root-to-leaf path 1->2
represents the number 12
.
The root-to-leaf path 1->3
represents the number 13
.
Return the sum = 12 + 13 = 25
.
分类:二叉树
题意:二叉树每条路径上的数组合成一个数,求这些数相加的总和
解法1:非递归后续遍历,每次遍历到叶子节点,计算当前栈内,所有节点(也就是这条路径)所代表的数,加上总和。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int sumNumbers(TreeNode root) {
if(root==null) return 0;
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode cur = root;
int sum = 0;
do{
while(cur!=null){
queue.add(cur);
cur = cur.left;
}
TreeNode p = null;
boolean flag = true;
while(flag&&queue.size()>0){
cur = queue.peekLast();
if(cur.right==p){
if(cur.left==null&&cur.right==null){
int t_sum = 0;
for(TreeNode t:queue){
t_sum = t_sum*10+t.val;
}
sum += t_sum;
}
p = cur;
queue.pollLast();
}else{
cur = cur.right;
flag = false;
}
}
}while(queue.size()>0);
return sum;
}
}
解法2:深度搜索。关键在于,对于每个节点,我们要知道它之前和是多少。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int sumNumbers(TreeNode root) {
return dfs(root,0);
}
/**
* cursum为root之前的总和
*/
public int dfs(TreeNode root,int cursum){
if(root==null) return 0;
if(root.left==null&&root.right==null){//如果是叶子节点
return cursum*10+root.val;//总和就是之前的*10+当前值
}
return dfs(root.left,10*cursum+root.val)+dfs(root.right,10*cursum+root.val);
}
}