给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
以 10^9 + 7 为模,返回这些数字之和。
示例:
1
/ \
0 1
/ \ / \
0 1 0 1
输入:[1,0,1,0,1,0,1]
输出:22
解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22
提示:
树中的结点数介于 1 和 1000 之间。
node.val 为 0 或 1 。
【思路】:
实际上就是dfs深搜。用一个StringBuffer存储遍历过的节点组成的字符串,每次遍历到叶子节点的时候把节点的值加进buffer,然后注意要回溯一下,递归完了之后要把加进去的节点吐出来。
StringBuffer删掉最后一个字符的方法是deleteCharAt(sb.length() - 1);
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//取模
int mod = 1000000007;
//存储字符串
StringBuffer sb;
//记录二进制数字的和
int sum = 0;
//得到子树的二进制字符串
public void dfs (TreeNode node){
//就说明是一个叶子节点
if(node.left == null && node.right == null){
sb.append(node.val);
sum = (sum + toDecNum(sb.toString())) % mod;
sb.deleteCharAt(sb.length() - 1);
return ;
}
//如果不是叶子节点
sb.append(node.val);
if(node.left != null){
dfs(node.left);
}
if(node.right != null){
dfs(node.right);
}
//因为每次递归加入了一个节点值,所以这里要回溯一下
sb.deleteCharAt(sb.length() - 1);
}
//把二进制字符串转换为十进制数字的方法
public int toDecNum(String binaryString){
//转成二进制整数
int dec = Integer.parseInt(binaryString, 2);
return dec;
}
public int sumRootToLeaf(TreeNode root) {
sb = new StringBuffer("");
dfs(root);
return sum;
}
}