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

posted @ 2021-12-20 11:19  小傻孩丶儿  阅读(36)  评论(0编辑  收藏  举报