题目:从根节点到叶子节点的数值累乘相加作为一个叶子节点的和,求所有叶子节点和的总和。
思路:可以考虑有深度优先DFS啊和广度优先BFS两种算法。
代码:
DFS:
class Solution {
public:
int sumNumbers(TreeNode* root) {
if(!root)
{
return 0;
}
Dfs(root,0);
return sum;
}
void Dfs(TreeNode* node,int currentSum){ //从根节点开始,一直累乘到子节点
if(!node)
{
return;
}
currentSum=currentSum*10+node->val;
if(node->left)
{
leafSum(node->left,currentSum);
}
if(node->right)
{
leafSum(node->right,currentSum);
}
else if(!node->left)
{
sum+=currentSum;
}
}
int sum;
};
BFS:
class Solution {
public:
struct nodeAndSum{
TreeNode* node;
int sum;
nodeAndSum(TreeNode* m_node,int m_sum): node(m_node),sum(m_sum){}
};
int sumNumbers(TreeNode* root) {
if(!root)
{
return 0;
}
Bfs(root);
return sum;
}
void Bfs(TreeNode* node){
if(!node)
{
return;
}
queue<nodeAndSum> qTree;
nodeAndSum rootAndsum(node,0);
qTree.push(rootAndsum); //将根和0(累乘值)放入队列
while(!qTree.empty())
{
nodeAndSum nodeAndsum=qTree.front();
TreeNode *tree=nodeAndsum.node;
int val=nodeAndsum.sum*10+tree->val;
cout<<val<<endl;
if(tree->left!=NULL){
nodeAndSum leftsum(tree->left,val);
qTree.push(leftsum); //将每个节点和其父节点的累乘值放入队列
}
if(tree->right!=NULL){
nodeAndSum rightsum(tree->right,val);
qTree.push(rightsum); //将每个节点和其父节点的累乘值放入队列
}
else if( NULL == tree->left)
{
sum+=val;
}
qTree.pop();
}
}
int sum;
};
两种算法DFS更快,BFS内存少一丢丢。