Leetcode從根到葉的二進位制數之和

2021-10-25 15:20:26 字數 1849 閱讀 4803

題目描述

給出一棵二叉樹,其上每個結點的值都是 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 。

解法一:遞迴

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;

}

解法二:基於dfs迭代解決其實和二叉樹的深度優先遍歷是類似的,只是此處需要記錄遍歷之後的值,所以需要兩個佇列,乙個佇列用於輔助遍歷,乙個佇列記錄迭代到某乙個節點時的值,下面以如下二叉樹進行說明

分析如下:

經上面分析,**如下,**裡面都有注釋。

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...