二分木が与えられると、その各ノードは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です。
コード:
/**
* 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:
int ans=0;
void dfs(TreeNode* root,int sum)
{
if(root->left==NULL && root->right==NULL) //叶子
{
ans += sum; //累加数字和
return;
}
if(root->left) dfs(root->left,sum*10+root->left->val); // 左子树
if(root->right) dfs(root->right,sum*10+root->right->val); // 右子树
}
int sumNumbers(TreeNode* root) {
if(root==NULL) return 0; //防止空指针
dfs(root,root->val);
return ans;
}
};