力扣(LeetCode)129

題目地址:
https://leetcode-cn.com/probl...
題目描述:java

給定一個二叉樹,它的每一個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都表明一個數字。

例如,從根到葉子節點路徑 1->2->3 表明數字 123。

計算從根到葉子節點生成的全部數字之和。

說明: 葉子節點是指沒有子節點的節點。

示例 1:

輸入: [1,2,3]
    1
   / \
  2   3
輸出: 25
解釋:
從根到葉子節點路徑 1->2 表明數字 12.
從根到葉子節點路徑 1->3 表明數字 13.
所以,數字總和 = 12 + 13 = 25.
示例 2:

輸入: [4,9,0,5,1]
    4
   / \
  9   0
 / \
5   1
輸出: 1026
解釋:
從根到葉子節點路徑 4->9->5 表明數字 495.
從根到葉子節點路徑 4->9->1 表明數字 491.
從根到葉子節點路徑 4->0 表明數字 40.
所以,數字總和 = 495 + 491 + 40 = 1026.

解答:
方法一,自底向上求出全部的路徑,而後把路徑求和。
java ac代碼:node

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int sumNumbers(TreeNode root) {
        if(root == null)return 0;
        List<String> list = getList(root);
        int ans = 0;
        for(String s : list)
            ans += Integer.parseInt(s);
        return ans;
        
    }
    
    List<String>getList(TreeNode root)
    {
        List<String> ans = new ArrayList();
        if(root == null)
            return ans;
        
        List<String>t1 = getList(root.left);
        List<String>t2 = getList(root.right);
        
        for(String s:t1)
            ans.add(root.val+s);
        for(String s:t2)
            ans.add(root.val+s);
        
        if(t1.size() == 0 && t2.size() == 0)
            ans.add(root.val+"");
        
        return ans;
    }
    
}

方法二,自頂向下搜索(深度優先搜索),搜索過程當中維護一個當前累加值,一旦搜索到葉子節點,就將如今的當前累加值加入結果中。這樣能夠每一個節點只訪問一遍,而且沒有額外空間消耗。
java ac代碼:code

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int sumNumbers(TreeNode root) {
        dfs(root,0);
        
        return ans;
        
    }
    
    int ans = 0;
    void dfs(TreeNode root,int temp)
    {
        if(root == null)
            return;
        temp = temp*10+root.val;
        if(root.left == null && root.right == null)
        {
            ans += temp;
            return;
        }
        
        dfs(root.left,temp);
        dfs(root.right,temp);
    }
    
}
相關文章
相關標籤/搜索