題目描述
給出一棵二叉樹,其上每個結點的值都是 0 或 1 。每一條從根到葉的路徑都代表乙個從最高有效位開始的二進位制數。例如,如果路徑為 0 -> 1 -> 1 -> 0 -> 1,那麼它表示二進位制數 01101,也就是 13 。對樹上的每一片葉子,我們都要找出從根到該葉子的路徑所表示的數字。返回這些數字之和。題目資料保證答案是乙個 32 位 整數。
示例 1:
輸入:root = [1,0,1,0,1,0,1]
輸出:22
解釋:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22
示例 2:
輸入:root = [0]
輸出:0
示例 3:
輸入:root = [1]
輸出:1
樹中的結點數介於 1 和 1000 之間。
node.val 為 0 或 1 。
解法一:遞迴
解法二:基於dfs迭代解決其實和二叉樹的深度優先遍歷是類似的,只是此處需要記錄遍歷之後的值,所以需要兩個佇列,乙個佇列用於輔助遍歷,乙個佇列記錄迭代到某乙個節點時的值,下面以如下二叉樹進行說明private static int sumroottoleaf(treenode root)
private static int sumbinary(treenode root, int cur)
//計算結果,等於 2 * cur + root.val
cur = (cur << 1) + root.val;
//說明已經到葉子接點了
if (root.left == null && root.right == null)
int leftvalue = sumbinary(root.left, cur);
int rightvalue = sumbinary(root.right, cur);
return leftvalue + rightvalue;
}
分析如下:
經上面分析,**如下,**裡面都有注釋。
private static int sumroottoleaf1(treenode root)
//定義乙個節點佇列(用於輔助進行dfs遍歷)
queuenodequeue = new linkedlist<>();
//定義乙個資料佇列(用於記錄到當前節點時的二進位制值,包含當前節點)
queuedataqueue = new linkedlist<>();
//起始時root 和 root.val 進入佇列
nodequeue.add(root);
dataqueue.add(root.val);
//返回值
int res = 0;
while (!nodequeue.isempty()) else
//新增右節點
if (node.right != null) }}
return res;
}
leetcode1022 從根到葉的二進位制數之和
給出一棵二叉樹,其上每個結點的值都是 0 或 1 每一條從根到葉的路徑都代表乙個從最高有效位開始的二進位制數。例如,如果路徑為 0 1 1 0 1,那麼它表示二進位制數 01101,也就是 13 對樹上的每一片葉子,我們都要找出從根到該葉子的路徑所表示的數字。以 10 9 7 為模,返回這些數字之和...
Leetcode 1022從根到葉的二進位制之和
給出一棵二叉樹,其上每個結點的值都是 0 或 1 每一條從根到葉的路徑都代表乙個從最高有效位開始的二進位制數。例如,如果路徑為 0 1 1 0 1,那麼它表示二進位制數 01101,也就是 13 對樹上的每一片葉子,我們都要找出從根到該葉子的路徑所表示的數字。返回這些數字之和。題目資料保證答案是乙個...
1022 從根到葉的二進位制數之和
package com.heu.wsq.leetcode.tree 1022.從根到葉的二進位制數之和 author wsq date 2020 12 22 給出一棵二叉樹,其上每個結點的值都是 0 或 1 每一條從根到葉的路徑都代表乙個從最高有效位開始的二進位制數。例如,如果路徑為 0 1 1 0...