給出一棵二叉樹,其上每一個結點的值都是 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);
}
}
複製代碼