LeetCode-129 Sum Root to Leaf Numbers

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); }

  

posted on 2015-01-13 23:39  linxiong1991  阅读(124)  评论(0)    收藏  举报

导航