1.题目
2.题解
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int result=0;//存放二叉树根节点到叶子节点的所有路径和
int sumNumbers(TreeNode* root) {
// write code here
//采用深度优先遍历二叉树,用先序遍历实现二叉树的深度优先遍历
pre_order(root,0);
return result;
}
//某结点的sum为根节点到该结点组成的数字,根节点的sum为0,因为根节点前无结点。
void pre_order(TreeNode* root,int sum)
{
if(!root)
return;
sum = sum*10 + root->val;//根结点到该结点组成的数字
if(!root->left && !root->right)//此时root左右结点为NULL,root为叶子结点
result = result + sum;
pre_order(root->left,sum);//遍历左子树
pre_order(root->right,sum);//遍历右子树
}
};
定义一个变量result来存放二叉树根节点到叶子节点的所有路径和。
采用要采用深度优先来遍历二叉树所有结点,记录下其根结点到某结点组成的数字。当遇到叶子结点时,把根结点到该叶子节点组成的数字累加到result上。
对某个结点的左子树和右子树分别递归进行上述过程。
对二叉树遍历不清楚的,请参考笔者的博文:二叉树的先序中序后序层序遍历C++实现
插一句话:
二叉树的深度优先遍历有:先序遍历、中序遍历、后序遍历。
二叉树的广度优先遍历有:层序遍历