力扣打卡第十九天 左叶子之和

404. 左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

力扣打卡第十九天 左叶子之和_第1张图片

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2:

输入: root = [1]
输出: 0

提示:

  • 节点数在 [1, 1000] 范围内
  • -1000 <= Node.val <= 1000

递归法

/**
 * 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&&!root->right)return 0;
        int res=0;
        //后序遍历
        //左 只有根据父节点才能判定这个是不是左叶子
        int left=sumOfLeftLeaves(root->left);
        if(root->left&&!root->left->left&&!root->left->right)
            left+= root->left->val;

        //右
        int right=sumOfLeftLeaves(root->right);
        
        //中
        res=left+right;//左子树的左叶子+右子树的左叶子之和
        return res;

    }
};

迭代法

/**
 * 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) {

        stackst;
        if(root==nullptr)return 0;
        if(!root->left&&!root->right)return 0;

        st.push(root);
        int res=0;
        while(!st.empty()){
            TreeNode* cur=st.top();
            st.pop();
            if(cur->left!=nullptr&&!cur->left->left&&!cur->left->right){
                //说明这是左叶子
                res+=cur->left->val;
            }
            if(cur->left)st.push(cur->left);
            if(cur->right)st.push(cur->right);
        }
        return res;
    }
};

这道题迭代法更好记

你可能感兴趣的:(leetcode,算法,c++,数据结构)