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:非递归后续遍历,每次遍历到叶子节点,计算当前栈内,所有节点(也就是这条路径)所代表的数,加上总和。
-
-
-
-
-
-
-
-
-
- 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:深度搜索。关键在于,对于每个节点,我们要知道它之前和是多少。
-
-
-
-
-
-
-
-
-
- public class Solution {
- public int sumNumbers(TreeNode root) {
- return dfs(root,0);
- }
-
-
-
-
- public int dfs(TreeNode root,int cursum){
- if(root==null) return 0;
- if(root.left==null&&root.right==null){
- return cursum*10+root.val;
- }
- return dfs(root.left,10*cursum+root.val)+dfs(root.right,10*cursum+root.val);
- }
- }
原文链接http://blog.youkuaiyun.com/crazy__chen/article/details/46523567