给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。

对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。

返回这些数字之和。题目数据保证答案是一个 32 位 整数。

 

示例 1:

LeetCode刷题【1022】从根到叶的二进制数之和
每个结点的值都是 0 或 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

示例 4:

输入:root = [1,1]
输出:3

 

提示:

  • 树中的结点数介于 11000 之间。
  • Node.val01
Related Topics
  • 深度优先搜索
  • 二叉树

  • 👍 121
  • 👎 0
  • 题解

    二叉树、二进制。好说,顺便复习下上次的LeetCode刷题【190】 颠倒二进制位,具体的二进制相关操作符和逻辑:

    与&:0&0=0 0&1=0 1&0=0 1&1=1
    或|:0|0=0 0|1=1 1|0=1 1|1=1
    异或^:0^0=0 0^1=1 1^0=1 1^1=0
    取反~:~1=0 ~0=1
    左移<<:左边的二进制位丢弃,右边补0
    右移>>:正数左补0,负数左补1,右边丢弃
    无符号左移<<<:左边的二进制位丢弃,右边补0
    无符号右移>>>:忽略符号位,空位都以0补齐

    深搜往下,每下一层,左移(<<)一位,此时末位为0,然后把当前节点的值放在末位,也就是或(|)或者是异或(^)操作都可以。

    然后就是判断什么是叶子节点了,这个也简单,只要是没有子节点了的都是叶子节点,也就是左右子节点都为空。遇到叶子节点的时候,把这个时候得到的值加到结果上即可。

    class Solution {
        int res = 0;
        public int sumRootToLeaf(TreeNode root) {
            dfs(0,root);
            return res;
        }
    
        public void dfs(int num, TreeNode root){
            if(root == null){
                return;
            }
            num = num << 1 | root.val;
            if (root.left == null && root.right == null){
                res += num;
            }
            dfs(num, root.left);
            dfs(num, root.right);
        }
    }

    左移一位也可以改为直接乘以2