层数最深叶子节点的和(深度优先搜索)
给你一棵二叉树的根节点 root
,请你返回 层数最深的叶子节点的和 。
示例 1:
输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8] 输出:15
示例 2:
输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5] 输出:19
提示:
- 树中节点数目在范围
[1, 104]
之间。 1 <= Node.val <= 100
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {int maxDepth;// 深度优先搜索void getMaxDepth(TreeNode* root, int dep) {if (root == NULL) {return;}if (dep > maxDepth) {maxDepth = dep;}getMaxDepth(root->left, dep + 1);getMaxDepth(root->right, dep + 1);}int deepestSum(TreeNode* root, int dep) {if (root == NULL) {return 0;}if (maxDepth == dep) {return root->val;}return deepestSum(root->left,dep+1)+deepestSum(root->right,dep+1);}public:int deepestLeavesSum(TreeNode* root) {maxDepth = 0;getMaxDepth(root, 0);return deepestSum(root,0);}
};
题目需要我们求出树最深处的值的和,我们就应该使用深度优先搜索,来找到树的最大深度
(1)我们先定义一个函数来求得最大深度。首先我们先选择递归出口,当节点为空时则结束递归,每次递归时都判断深度是否为最大深度,每次往下递归,就将深度加1,最终遍历完整颗树后,得出最大深度。
(2)我们知道最大深度后,还需要在遍历一次这颗树,当节点为最大深度时,加进sum。首先我们想递归出口,当root为NULL时说明树为空返回0,如果最大深度等于当前节点深度时,则返回当前节点的值,如果不是最大深度,则返回左右子节点找到的最大深度的值的和。