【力扣 129. 求根到叶子节点数字之和】 回溯/dfs 记录一些问题

前言: 这道题目不难, 这里不做解释了,只是记录做题中遇到的一个问题。

思路还是深度遍历 : 碰到叶子节点就返回。

/**
 * 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 , 就会直接返回,而一旦返回了,程序就会删掉路径表的最后一个数,导致路径记录表失去记录。

经过调试之后,还是有点不明就里。还是再多刷刷题感受一下吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值