给出一棵二叉树,其上每个结点的值都是 0
或 1
。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1
,那么它表示二进制数 01101
,也就是 13
。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32 位 整数。
示例 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
提示:
- 树中的结点数介于
1
和1000
之间。 Node.val
为0
或1
。
Related Topics
题解
二叉树、二进制。好说,顺便复习下上次的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