题目
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32 位 整数。
- 树中的节点数在 [1, 1000] 范围内
- Node.val 仅为 0 或 1
题解
1
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sumRootToLeaf(TreeNode root) {
List<String> list = new ArrayList<>();
String str = "";
dfs(root, str, list);
int res = 0;
for(int i = 0; i < list.size(); ++i) {
res += toDecimal(list.get(i));
}
return res;
}
public void dfs(TreeNode root, String str, List<String> list) {
str += String.valueOf(root.val);
if(root.left == null && root.right == null) {
list.add(str);
str = "";
}
if(root.left != null) dfs(root.left, str, list);
if(root.right != null) dfs(root.right, str, list);
}
//二进制->十进制
public int toDecimal(String num) {
int base = 1;
int res = 0;
for(int i = num.length() - 1; i >= 0; --i) {
int val = num.charAt(i) - '0';
res += val * base;
base *= 2;
}
return res;
}
}
虽然做出来了,但是效率很低…
利用Integer.parseInt(list.get(i),2)将对应二进制字符串转换成十进制数字,内存消耗会减小
2
参考评论区的题解,只能说自己要学得还有很多…
(反思一下,自己对于问题的思考太过于线性化,还是要尽可能多维一点)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sumRootToLeaf(TreeNode root) {
return helper(root, 0);
}
private int helper(TreeNode root, int sum) {
if(root == null) return 0;
sum = 2 * sum + root.val;
if(root.left == null && root.right == null) { //叶子节点
return sum;
}
return helper(root.left, sum) + helper(root.right, sum);
}
}