题目描述
给出一棵二叉树,其上每个结点的值都是 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 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-root-to-leaf-binary-numbers
解法
在完整的解法中,我加入了建树的步骤,是用数组层序创建的方式。关键在于找左右子节点与数组元素序号之间的关系。数组中我用-1表示插入空节点。
而题目要求的函数不难实现,用递归的方式。同时也需要知道二进制数的计算方式。
TreeNode.h
#pragma once
#include<iostream>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
};
typedef struct TreeNode TreeNode;
Solution.h
#pragma once
#include"TreeNode.h"
#include<vector>
class Solution
{
public:
int sumRootToLeaf(TreeNode* root);
int sumRootToLeaf(TreeNode* root, int total);
void insert(TreeNode* p, vector<int> temp, int t);
TreeNode* createFromArray(vector<int> temp);
};
Solution.cpp
#include "Solution.h"
int Solution::sumRootToLeaf(TreeNode* root)
{
return sumRootToLeaf(root, 0);
}
int Solution::sumRootToLeaf(TreeNode* root, int total)
{
int value = total * 2 + root->val;
if (root->left == NULL && root->right == NULL)
return value;
else
{
int sum = 0;
if (root->left != NULL)
sum += sumRootToLeaf(root->left, value);
if (root->right != NULL)
sum += sumRootToLeaf(root->right, value);
return sum;
}
}
void Solution::insert(TreeNode* p, vector<int> temp, int t)
{
int length = temp.size();
if (t >= length)return;
p->val = temp[t];
if ((2 * (t + 1)) <= length)
{
if (temp[2 *t + 1] != -1)
{
TreeNode* l;
l = (TreeNode*)malloc(sizeof(TreeNode));
l->left = NULL;
l->right = NULL;
p->left = l;
insert(p->left, temp, 2 * (t + 1) - 1);
}
if ((2 * (t + 1) + 1) <= length)
{
if (temp[2 * (t + 1)] != -1) {
TreeNode* r;
r = (TreeNode*)malloc(sizeof(TreeNode));
r->left = NULL;
r->right = NULL;
p->right = r;
insert(p->right, temp, 2 * (t + 1));
}
}
}
}
TreeNode* Solution::createFromArray(vector<int> temp)
{
TreeNode* p;
p = (TreeNode*)malloc(sizeof(TreeNode));
p->left = NULL;
p->right = NULL;
insert(p, temp, 0);
return p;
}