从根到叶的二进制数之和(1022)

题目: 给出一棵二叉树,其上每个结点的值都是 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时:0
2+1
访问0时:(0*2+1)2+0
访问1时:((0
2+1)2+0)2+1
故将最终结果展开可得((0
2+1)2+0)2+1 = 12的2次方+02的1次方+1
2的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);
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值