404. 左叶子之和
难度简单(虽然简单 但是我用递归做时 还是有点坑的)
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
提示:
- 节点数在
[1, 1000]
范围内 -1000 <= Node.val <= 1000
//未考虑周到
我自己写时 只考虑到了 如何找到左叶子节点 然而却忽略了 上面示例会直接返回 而没有去走右边的子树
官方代码 看似没有特点 实则暗藏玄机 它在遍历左树时不仅记录了数值 而且返回了 (考虑到了上面的那种情况 )
长记性了 以后写代码还是要学习学习这种写法
#include<iostream>
using namespace std;
// 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 {
public:
int sumOfLeftLeaves(TreeNode* root) {
/*if (root == nullptr)return 0;
if (root->left == nullptr && root->right == nullptr)return 0;
if (root->left != nullptr && root->left->left == nullptr && root->left->right == nullptr)return root->left->val;
return sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);*/
//以上是错误代码 我掉进去的示例就是下面的 没考虑周到
if (root == nullptr)return 0;
if (root->left == nullptr && root->right == nullptr)return 0;
int sumleft = sumOfLeftLeaves(root->left);
if (root->left->left == nullptr && root->left->right == nullptr)
//return root->left->val;
sumleft = root->left->val;
int sumright = sumOfLeftLeaves(root->right);
return sumleft+sumright;
}
};
int main()
{
TreeNode a1, a2, a3, a4, a5;
a1.left = &a2;
a1.right = &a3;
a3.left = &a4;
a3.right = &a5;
a1.val = 3;
a2.val = 9;
a3.val = 20;
a4.val = 15;
a5.val = 7;
Solution A;
cout<< A.sumOfLeftLeaves(&a1) << endl;
return 0;
}
总结的不是很好 有大神的话请指教