leetcode二叉樹-從根到葉的二進位制數之和
阿新 • • 發佈:2021-12-20
dfs+二進位制轉換+位移
不會,我可以學;落後,我可以追趕;跌倒,我可以站起來!package binarytree.sumRootToLeaf; import binarytree.untils.GenerateTreeNode; import binarytree.untils.TreeNode; import java.util.ArrayList; import java.util.List; /** * 1022. 從根到葉的二進位制數之和 * 給出一棵二叉樹,其上每個結點的值都是 0 或 1 。每一條從根到葉的路徑都代表一個從最高有效位開始的二進位制數。例如,如果路徑為 0 -> 1 -> 1 -> 0 -> 1,那麼它表示二進位制數 01101,也就是 13 。 * <p> * 對樹上的每一片葉子,我們都要找出從根到該葉子的路徑所表示的數字。 * <p> * 返回這些數字之和。題目資料保證答案是一個 32 位 整數。 * <p> * <p> * <p> * 示例 1: * <p> * <p> * 輸入:root = [1,0,1,0,1,0,1] * 輸出:22 * 解釋:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22 * 示例 2: * <p> * 輸入:root = [0] * 輸出:0 * 示例 3: * <p> * 輸入:root = [1] * 輸出:1 * 示例 4: * <p> * 輸入:root = [1,1] * 輸出:3 * <p> * <p> * 提示: * <p> * 樹中的結點數介於 1 和 1000 之間。 * Node.val 為 0 或 1 。 */ public class sumRootToLeaf { /** * dfs 注意到葉子節點就停止當前遍歷, * 二進位制轉換那塊 101 = 0(當前結果)<<1+ 1(當前節點的值) * @param root * @return */ public static int sumRootToLeaf(TreeNode root) { List<Integer> res = new ArrayList<>(); preOrder(root, 0, res); int sum = 0; for (int i = 0; i < res.size(); i++) { sum += res.get(i); } return sum; } private static void preOrder(TreeNode root, Integer val, List<Integer> res) { if (root == null) { return; } val = (val << 1 )+ root.val; if (root.left == null && root.right == null) { res.add(val); return; } else { preOrder(root.left, val, res); preOrder(root.right, val, res); } } public static void main(String[] args) { Integer[] nums = {1, 0, 1, 0, 1, 0, 1}; TreeNode treeNode = GenerateTreeNode.generateTreeNode(nums); sumRootToLeaf(treeNode); } }