• 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);
        }
    }
    
    
  • 相关阅读:
    Java反射(2)访问字段(Field)
    《编程珠玑》中“位图排序”引发的一系列实验
    Java : 传值or传引用?
    const 指针
    三种数据库访问——Spring3.2 + Hibernate4.2
    三种数据库访问——Spring JDBC
    数据库连接池:Druid
    三种数据库访问——原生JDBC
    介绍4款json的java类库 及 其性能测试
    云存储(Swift+Keystone)部署策略
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/15710100.html
Copyright © 2020-2023  润新知