前言: 这道题目不难, 这里不做解释了,只是记录做题中遇到的一个问题。
思路还是深度遍历 : 碰到叶子节点就返回。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int t=0 ;
private void dfs (TreeNode root ,int sum )
{
if(root ==null)
return ;
sum=sum*10+root.val ;
if(root.left==null && root.right==null) {
t+=sum ;
sum =0 ;
return ;
}
dfs(root.left ,sum ) ;
dfs(root.right ,sum ) ;
}
public int sumNumbers(TreeNode root)
{
if(root==null)
return 0;
dfs(root ,0) ;
return t ;
}
}
回溯解法:
class Solution {
int sum =0 ;
private int multiply(LinkedList<Integer> path)
{
int t= 0 , n=1 ;
while(!path.isEmpty()) {
t = t + path.pollLast() * n;
n *= 10;
}
return t ;
}
private void helper(TreeNode root , LinkedList<Integer> path )
{
if(root ==null)
return ;
path.add(root.val) ;
if(root.left==null && root.right==null) {
sum += multiply(new LinkedList(path));
return;
}
if(root.left !=null) {
helper(root.left , path ) ;
path.removeLast() ;
}
if(root.right!=null ) {
helper(root.right, path);
path.removeLast();
}
}
public int sumNumbers(TreeNode root)
{
if(root==null)
return 0;
LinkedList<Integer> path = new LinkedList<Integer> () ;
helper(root ,path) ;
return sum ;
}
}
我第一次也是使用回溯算法, 但是却没有在递归前加入判断
if(root.right!=null )
, if(root.left !=null)
出来的结果完全不一样, 这里面多出来的步骤是:函数中发现当前结点为null , 就会直接返回,而一旦返回了,程序就会删掉路径表的最后一个数,导致路径记录表失去记录。
经过调试之后,还是有点不明就里。还是再多刷刷题感受一下吧。