题目链接
力扣网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
思路分析
知识点:递归、深度优先搜索
解析:
这里是深度优先搜索的经典运用。题目要求找左叶子的和,那么前提是它一定是一个叶子结点,其次才判断它是否是左叶子。
这里采用一个bool函数再判断一下是否为叶子结点
如果根结点为空,返回0;
其次去往左子树找,如果左子树存在且不为叶子结点的话,继续往它的左子树找,直到找到叶子结点为止,如果是叶子结点,直接返回它的值累加到一个变量里。
最后去往右子树找,右子树的递归条件和左子树不一样,因为右子树也会存在有左叶子结点的情况,所以如果右子树是一个叶子结点的话就没必要递归了,但如果不是的话,就得往右子树里找。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isleaves(struct TreeNode* root)
{
return root->left==NULL&&root->right==NULL;
}
int dfs(struct TreeNode* root)
{
int ans=0;
if(root->left)
{
ans+=isleaves(root->left)?root->left->val:dfs(root->left);
}
if(root->right&&!isleaves(root->right))
{
ans+=dfs(root->right);
}
return ans;
}
int sumOfLeftLeaves(struct TreeNode* root){
return root==NULL?0:dfs(root);
}