10.29129.求根到叶子节点数字之和 难度:中等

mac2024-04-05  51

题目描述:

给定一个二叉树,它的每个结点都存放一个 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.

思路:

遍历二叉树,当遍历到叶子节点后,将遍历得到的数字存进一个数组中,遍历完场,将数组中的数字加起来得出最后结果,这种方法因为要借助外部空间,空间复杂度较大

class Solution { public: int sumNumbers(TreeNode* root) { if(!root) return 0; vector<int> nums; pathNums(root,0,nums); int sum=0; for(int i=0;i<nums.size();++i){ sum += nums[i]; } return sum; } void pathNums(TreeNode* node, int num, vector<int>& nums){ if(!node) return; //可能传入非叶子节点的空节点 if(node->left == NULL && node->right == NULL) { num = num*10 + node->val; nums.push_back(num); return; } num = num*10 + node->val; pathNums(node->left,num,nums); pathNums(node->right,num,nums); } };

代码优化:不利用外部空间 参考评论中的做法直接求sum,不对每个数字做存储后再求和

class Solution { public: int sumNumbers(TreeNode* root) { if(!root) return 0; return pathNums(root,0); } int pathNums(TreeNode* node, int num){ if(!node) return 0; if(node->left == NULL && node->right == NULL) { num += node->val; return num; //返回到叶子节点时的值 } num += node->val; //求路径值 return pathNums(node->left,num*10)+pathNums(node->right,num*10); //求和 } };

 

最新回复(0)