这个题的意思是每条root到leaf的路径当成一个数,然后计算所有路径所代表的数的和。
树的路径最好用的就是递归,每个节点返回一个栈,栈里包含所有路径的linkedlist。
public Stack<LinkedList> sumNum(TreeNode root) {
if(root.left==null&root.right==null){
LinkedList<Integer> l = new LinkedList<Integer>();
l.add(root.val);
Stack<LinkedList> s = new Stack<LinkedList>();
s.push(l);
return s;
}
Stack<LinkedList> s = new Stack<LinkedList>();
if(root.left!=null){
Stack<LinkedList> s1 = sumNum(root.left);
while(!s1.isEmpty()){
LinkedList<Integer> l=s1.pop();
l.add(root.val);
s.push(l);
}
}
if(root.right!=null){
Stack<LinkedList> s2 = sumNum(root.right);
while(!s2.isEmpty()){
LinkedList<Integer> l=s2.pop();
l.add(root.val);
s.push(l);
}
}
return s;
}
public int sumNumbers(TreeNode root) {
if(root==null) return 0;
Stack<LinkedList> s = sumNum(root);
int sum=0;
while(!s.isEmpty()){
LinkedList<Integer> l=s.pop();
int ji=1;
while(!l.isEmpty()){
int zhi = l.removeFirst();
sum = sum+zhi*ji;
ji=ji*10;
}
}
return sum;
}Update 2015/08/18: 上面的解法很复杂,其实这道题用回溯法即可:
/**
* 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 check(TreeNode root, int tmp, int res){
if (root == null)
return 0;
tmp = tmp * 10 + root.val;
if (root.left == null && root.right == null){
res += tmp;
}
int a = check(root.left, tmp, res);
int b = check(root.right, tmp, res);
tmp = (tmp - root.val) / 10;
return res + a + b;
}
public int sumNumbers(TreeNode root) {
return check(root, 0, 0);
}
}
本文介绍了一种解决二叉树路径之和问题的方法,利用递归遍历二叉树的所有路径,并计算从根节点到叶子节点路径所代表数字的总和。提供了两种解决方案:一种是使用栈和链表来存储路径,另一种是采用简洁的回溯法。
1159

被折叠的 条评论
为什么被折叠?



