问题描述 :
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
示例 2:
输入: [4,9,0,5,1]
4
/ \
9 0
/ \
5 1
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495.
从根到叶子节点路径 4->9->1 代表数字 491.
从根到叶子节点路径 4->0 代表数字 40.
因此,数字总和 = 495 + 491 + 40 = 1026.
可使用以下main函数:
#include <iostream>
#include <queue>
#include <cstdlib>
#include <cstring>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(NULL), right(NULL) {}
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
TreeNode* inputTree(){
int n,count=0;
char item[100];
cin>>n;
if (n==0)
return NULL;
cin>>item;
TreeNode* root = new TreeNode(atoi(item));
count++;
queue<TreeNode*> nodeQueue;
nodeQueue.push(root);
while (count<n){
TreeNode* node = nodeQueue.front();
nodeQueue.pop();
cin>>item;
count++;
if (strcmp(item,"null")!=0){
int leftNumber = atoi(item);
node->left = new TreeNode(leftNumber);
nodeQueue.push(node->left);
}
if (count==n)
break;
cin>>item;
count++;
if (strcmp(item,"null")!=0){
int rightNumber = atoi(item);
node->right = new TreeNode(rightNumber);
nodeQueue.push(node->right);}
}
return root;
}
int main(){
TreeNode* root;
root=inputTree();
int res=sumNumbers(root);
cout<<res<<endl;
}
输入说明 :
首先输入结点的数目n(注意,这里的结点包括题中的null空结点)
然后输入n个结点的数据,需要填充为空的结点,输入null。
输出说明 :
输出一个整数(在32位int型数表示范围内),表示结果。
输入范例 :
5
4 9 0 5 1
输出范例 :
1026
void dfs(TreeNode* node,vector<int> &sums,int sum){
if(node==NULL){
return ;
}
sum=sum*10+node->val;
if(node->left==NULL&&node->right==NULL){
sums.push_back(sum);
sum=sum/10;
}
dfs(node->left,sums,sum);
dfs(node->right,sums,sum);
}
int sumNumbers(TreeNode* root){
vector<int> sums;
dfs(root,sums,0);
int count=0;
for(int i=0;i<sums.size();i++){
count+=sums[i];
}
return count;
}
版权声明:本文为ZhEnG_jIe_YuAn原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。