趣題集.Leetcode 1022

給出一棵二叉樹,其上每一個結點的值都是 0 或 1 。每一條從根到葉的路徑都表明一個從最高有效位開始的二進制數。例如,若是路徑爲 0 -> 1 -> 1 -> 0 -> 1,那麼它表示二進制數 01101,也就是 13 。node

對樹上的每一片葉子,咱們都要找出從根到該葉子的路徑所表示的數字。bash

以 10^9 + 7 爲模,返回這些數字之和。ui

示例:spa

輸入:[1,0,1,0,1,0,1] 輸出:22 解釋:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22code

提示:cdn

樹中的結點數介於 1 和 1000 之間。 node.val 爲 0 或 1 。blog

思路分析: 經過DFS+位移運算能夠輕鬆解決問題.當處於根節點時,數字是1,遍歷左子節點,將1左移一位再與左子節點的值進行或運算,此時結果爲二進制的'10',也就是十進制的2,當遍歷到第3層左子樹時,再將2左移一位或上該節點的值,即爲'100',也就是4.碰到葉子節點則返回,而後遍歷完全部的路徑以後求和即爲最後的結果.it

代碼以下:io

public class Solution extends LeetCode {
    int result = 0;
    public int sumRootToLeaf(TreeNode root) {
        reverse(root, 0);
        return result;
    }

    public void reverse(TreeNode node, int num) {
        if (node == null) {
            return;
        }

        num = num << 1 | node.val;
        if (node.left == null && node.right == null) {
            result = result + num;
            return;
        }

        reverse(node.left, num);
        reverse(node.right, num);
    }
}
複製代碼
相關文章
相關標籤/搜索