1. 程式人生 > >求從根節點到葉子節點的所有路徑組成的數的和

求從根節點到葉子節點的所有路徑組成的數的和

問題:給定一顆二叉樹,節點的值只能為0~9中的一個,每一個從根節點到葉子節點的路徑代表一個數,比如,有一個從根節點到葉子節點的路徑是 1->2->3,則這個路徑代表數字是123。求出從根節點到所有葉子節點的路徑所代表數字的和是多少。

再比如,有如下二叉樹:

    1
   / \
  2   3
問題的答案=12 + 13 = 25

二叉樹的結構如下:

//Definition for binary tree
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

方法一:使用遞迴。可以考慮深度優先遍歷,程式需要儲存一個整形變數sum,表示在這條路徑上已經遍歷得到的數字;然後遍歷下一個節點node,如果node為空,返回sum即可,如果node是葉子節點,返回sum*10 + node.val即可,否則,對左孩子和右孩子遞迴呼叫此方法。

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

方法二:使用非遞迴。設定兩個佇列,nodequeue用於儲存節點,對於nodequeue中的第i個元素nodei,valqueue中的第i個元素儲存從根節點到nodei節點的路徑所組成的數字,經過這樣的對應關係,我們可以遍歷nodequeue佇列,當遍歷的第i個元素nodei的左孩子不為零時,將左孩子放入nodequeue,將valqueue的第i個元素的值乘以10再加上左孩子的值,放入valqueue佇列,對右孩子做同樣的操作。當遍歷的節點nodei是葉子節點時,說明從根節點到nodei節點的數字已經計算完成了,當所有的從根節點到葉子節點的數字都計算完成,即nodequeue佇列為空時,將這些數字相加就得到了結果。

public int sumNumbers(TreeNode root) {
    if(root == null)
        return 0;
        
    Queue<TreeNode> nodequeue = new LinkedList<TreeNode>();
    Queue<Integer> valqueue = new LinkedList<Integer>();
    nodequeue.offer(root);
    valqueue.offer(root.val);
    int sum = 0;
    
    while(!nodequeue.isEmpty()){
        TreeNode node = nodequeue.poll();
        Integer val = valqueue.poll();
        
        if(node.left != null){
            nodequeue.offer(node.left);
            valqueue.offer((Integer)(val*10 + node.left.val));
        }
        if(node.right != null){
            nodequeue.offer(node.right);
            valqueue.offer((Integer)(val*10 + node.right.val));
        }
        if(node.left == null && node.right == null){
            sum += val; 
        }
    }
    return sum;
}


相關推薦

節點葉子節點所有路徑組成的數的

問題:給定一顆二叉樹,節點的值只能為0~9中的一個,每一個從根節點到葉子節點的路徑代表一個數,比如,有一個從根節點到葉子節點的路徑是 1->2->3,則這個路徑代表數字是123。求出從根節點到所有葉子節點的路徑所代表數字的和是多少。 再比如,有如下二叉樹:

二叉樹系列---所有葉子路徑組成的數的

題目: 給定一個二叉樹,從根到葉子的所經過的所有節點的值組成一個數,求所有路徑數的和; 比如, 1 / \ 2 3 12+13=25 實現: 從上向下求,遞迴; 根:sum=val; 向下:sum=sum*10+va

hdu6035 Colorful Tree 樹形dp 給定一棵樹,每個節點有一個顏色值。定義每條路徑的值為經過的節點的不同顏色數。所有路徑的值

void 題意 iostream cnblogs 編號 emp php scanf http /** 題目:hdu6035 Colorful Tree 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 題意:給定一棵樹,每

leetcode 129. 葉子節點數字之和

為什麽 計算 int 布爾 給定 vector ini treenode 二叉樹 給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生

LeetCode 129. 葉子節點數字之和(Sum Root to Leaf Numbers)

更新 truct 個數 遍歷 null 它的 etc col tco 題目描述 給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節

LeetCode 897 129 98 遞增順序查詢樹 葉子節點之和 驗證二叉樹 (樹,深度優先搜尋)

1.遞增順序查詢樹 難度:簡單 給定一個樹,按中序遍歷重新排列樹,使樹中最左邊的結點現在是樹的根,並且每個結點沒有左子結點,只有一個右子結點。 示例 : 輸入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / \

Leetcode 129 葉子節點數字之和(遞迴)

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點是指沒有子節點的節點。 示

Leetcode:129.葉子節點數字之和

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點

129. 葉子節點數字之和(中等,樹)

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。計算從根到葉子節點生成的所有數字之和。 示例 1: 輸入: [1,2,3] 1 / \ 2 3 輸出: 25 思路:先求出每條路徑上的數字組成的字串

LeetCode129. 葉子節點數字之和

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所

129.葉子節點數字之和

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點是指沒有子節點的節點。 示例 1: 輸

hdu 1599 find the mincost route 無向圖的最小環 一個點遍歷所有節點以後回到原點的最短

                在寫題解之前給自己打一下廣告哈~。。抱歉了,希望大家多多支援我在CSDN的視訊課程,地址如下:http://edu.csdn.net/course/detail/209題目:find the mincost routeTime Limit: 1000/2000 MS (Java

【LeetCode】#129葉子節點數字之和(Sum Root to Leaf Numbers)

【LeetCode】#129求根到葉子節點數字之和(Sum Root to Leaf Numbers) 題目描述 給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。

LeetCode-129.葉子節點數字之和(相關話題:深度優先)

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點是指沒有子節點的節點。 示例 1: 輸入: [1,2

(LeetCode 129)葉子節點數字之和 [簡單DFS ]

129. 求根到葉子節點數字之和 給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點是指沒有子節點

無向圖中節點的迭代得到起始節點到結束節點之間的所有路徑,並從中得到最短路徑節點

無向無權圖中節點的迭代得到從起始節點到結束節點之間的所有路徑,並從中得到最短路徑的節點。由於是無權圖,則所有的路徑的權值可以當做是1.只需要得到所有可能路徑中包含節點最小的便是最短的路徑了。 本例子可以作為在一個連線的圖中查詢一個節點到另一個節點路徑

【LeetCode 中等題】59-葉子節點數字之和

題目描述:給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。例如,從根到葉子節點路徑 1->2->3 代表數字 123。計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點是

經典演算法學習——二叉樹葉子節點的個數

核心程式碼如下:int leafCount = 0; void LeafCountBinaryCount(Node *node) { if (node == NULL) {

二叉樹葉子節點的個數 && 第K層的節點個數

求二叉樹葉子節點的個數 思路: 1.如果根節點為NULL時,則是空樹,返回0; 2.根節點不為空時,如果根節點的左右子樹均為空,則該二叉樹中只有一個節點,即返回1; 3.葉子節點的個數=左子樹葉子節點

每日一題——二叉樹葉子節點個數,第K層節點個數

1,求葉子節點個數 int leafnum(Node* root) { if(root == NULL) return 0; if(root->left ==