1. 程式人生 > 其它 >leetcode二叉樹-從根到葉的二進位制數之和

leetcode二叉樹-從根到葉的二進位制數之和

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);
    }
}

不會,我可以學;落後,我可以追趕;跌倒,我可以站起來!