题目: 给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
以 10^9 + 7 为模,返回这些数字之和。
示例:
思路分析:
一、本题需要得到从根到叶的结点值所组成的二进制数,如何得到,这一步解题思路可以参考二叉树的所有路径,当我们知道如何构造一条完整路径时,其余要做的只有考虑如何将一个二进制数转化为十进制数并求和。
二、对于一个二进制数110来说,其十进制为(110)(2) = 12的2次方+12的1次方+02的0次方,但是由于我们是由顶到底获取这个二进制数,而顶是最高位,我们无法准确获悉该二进制数共有多少层,故更不知道要进行2的几次方,故需要想一个完全的结局方法,即访问下一层时,就对上一层进行乘2的操作:
比如递归构建101这条路径时,
访问1时:02+1
访问0时:(0*2+1)2+0
访问1时:((02+1)2+0)2+1
故将最终结果展开可得((02+1)2+0)2+1 = 12的2次方+02的1次方+12的0次方=5
算法复杂度分析:
1.时间复杂度:O(N),访问所有结点一次且仅一次
2.空间复杂度:O(N),如果不考虑递归使用的辅助栈,只是建立了几个变量,则复杂度为O(1)
Code
class Solution {
int ans = 0;
int mod = 1000000000 + 7;
public int sumRootToLeaf(TreeNode root) {
helper(root, 0);
return ans % mod;
}
public void helper(TreeNode root, int sum) {
if (root != null) {
sum = sum * 2 + root.val;
if (root.left == null && root.right == null) {
ans += sum;
} else {
helper(root.left, sum);
helper(root.right, sum);
}
}
}
}