代码改变世界

[LeetCode] 129 Sum Root to Leaf Numbers 求根到叶节点数字之和

2017-04-26 06:30  naturesound  阅读(183)  评论(0编辑  收藏  举报

此题题意是求所有从根结点到叶节点的路径转化为数字后之和。

因为是二叉树,容易想到是用递归求解。

整体思想是从根到叶子进行遍历,其中不断保存当前的中间结果(上一层的结果乘以10后加上当前层根节点的数值)并通过参数向下传递。。。

到达叶子节点时可以逐层返回最终结果。解法不难,但有几个细节需要考虑清楚。

1)可以用递归函数dfs的参数表内置的返回和来返回数值,也可以直接用dfs返回值,对应于以下两种定义:

void dfs(TreeNode *root, int &sum, int pre);

int dfs(TreeNode *root, int pre);

2) 因为是从根到叶子节点的路径和,所以需要在判断为叶子节点时返回数值。

3) 当前节点为空时,直接返回0,这句话可以在递归时省略判断子树是否非空的语句并且避免将非叶子节点的路径加入计算。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     int sumNumbers(TreeNode* root) {
13         int pre = 0;
14         return dfs(root, pre);
15     }
16     int dfs(TreeNode *root, int pre){
17         if(!root) return 0;
18         int sum = pre*10 + root->val;
19         if(!root->left && !root->right) return sum;
20         return dfs(root->left, sum) + dfs(root->right, sum);
21     }
22 };