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 number 123.
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. 非递归解法
借助两个栈实现,其中一个栈保存遍历到的上层节点,另一个栈保存上一个栈中各个节点的遍历情况,即记录左子结点是否已遍历。
代码如下
public int sumNumbers(TreeNode root) {
if(root == null)
return 0;
int sum = 0;
List<TreeNode> mem = new ArrayList<TreeNode>();
List<Boolean> flag = new ArrayList<Boolean>();
mem.add(root);
while(!mem.isEmpty()) {
if(flag.size() < mem.size()) {
flag.add(false);
} else if(!flag.get(flag.size()-1)) {
flag.set(flag.size()-1, true);
} else {
mem.remove(mem.size()-1);
flag.remove(flag.size()-1);
continue;
}
if(!flag.get(flag.size()-1)) {
if(mem.get(mem.size()-1).left != null) {
mem.add(mem.get(mem.size()-1).left);
continue;
}
}
flag.set(flag.size()-1, true);
if(mem.get(mem.size()-1).right != null) {
mem.add(mem.get(mem.size()-1).right);
continue;
}
if(mem.get(mem.size()-1).left == null && mem.get(mem.size()-1).right == null) {
for(int i=mem.size()-1; i>=0; i--) {
sum += (mem.get(i).val * Math.pow(10, mem.size() - i - 1));
}
}
mem.remove(mem.size() - 1);
flag.remove(flag.size() - 1);
}
return sum;
}
2. 递归解法。代码如下
public int sumNumbers(TreeNode root) {
return sum(root, 0);
}
public int sum(TreeNode n, int s){
if (n == null) return 0;
if (n.right == null && n.left == null) return s*10 + n.val;
return sum(n.left, s*10 + n.val) + sum(n.right, s*10 + n.val);
}
LeetCode-129 Sum Root to Leaf Numbers
原文:http://www.cnblogs.com/linxiong/p/4222882.html