今天还挺难过,学了这么久的树,递归的题还是有问题,我什么时候才能明白呀,有时候感觉自己不适合学习,不适合学计算机。
/**
* 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 max1;
void depthmax(TreeNode* root,int dep){
if(root==NULL){
return ;
}
if(dep>max1){
max1=dep;
}
if(root->left!=NULL){
depthmax(root->left,dep+1);
}
if(root->right!=NULL){
depthmax(root->right,dep+1);
}
}
int sumdepthmax(TreeNode *root,int dep){
if(root==NULL){
return 0;
}
if(dep==max1){
return root->val;
}
int suml=sumdepthmax(root->left,dep+1);
int sumr=sumdepthmax(root->right,dep+1);
return suml+sumr;
}
public:
int deepestLeavesSum(TreeNode* root) {
max1=0;
depthmax(root,0);
return sumdepthmax(root,0);
}
};

这个题首先要两个函数,一个函数来求最大深度,我做第二遍的时候感觉思路很模糊,就是因为我没有想到先定义一个最大深度,然后再不断更新最大深度的值,如果左子树的深度大于最大深度,我们就将最大深度的值替换,右子树也一样。
第二个函数是求和函数,首先我的递归出口的条件错了,我的判断是假如左子树和右子树均为空的时候,这样反而会漏了最大深度,因为这样做相当于只要是没有孩子节点,就返回0,而我们要的是最大深度的节点,正确的应该是当此节点为空的时候,我们返回0,