给出一棵二叉树,其上每个结点的值都是 0
或 1
。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1
,那么它表示二进制数 01101
,也就是 13
。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
以 10^9 + 7
为模,返回这些数字之和。
示例:
输入:[1,0,1,0,1,0,1] 输出:22 解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22
提示:
- 树中的结点数介于
1
和1000
之间。 - node.val 为
0
或1
。
题目标签:Tree
题目链接:LeetCode / LeetCode中国
Language | Runtime | Memory |
---|---|---|
cpp | 12 ms | 17.2 MB |
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> path;
int res = 0;
void dfs(TreeNode* node) {
if (!node) return;
path.push_back(node->val);
if (node->left)
dfs(node->left);
if (node->right)
dfs(node->right);
// 到了叶子节点
if (!node->left && !node->right) {
int num = 0;
for (int i = 0; i < (int)path.size(); i++) {
if (path[i] == 1) {
num |= (1 << (int)path.size() - i - 1);
}
}
// for (int p : path) cout << p << ", "; cout << endl;
// cout << num << endl;
res += num;
}
path.pop_back();
}
int sumRootToLeaf(TreeNode* root) {
dfs(root);
return res;
}
};