Leetcode 404.左叶子之和

题目地址

思路

这道题首先要搞清楚什么是左叶子,即如何去判断一个节点是叶子节点

图源:代码随想录
如上图所示,2节点是叶子节点,但他不是左叶子节点。

所以我们要判断一个节点是不是左叶子节点,要从父节点出发。即:

父节点的左孩子节点是否非空**&&父节点的左孩子节点的左孩子节点是否为空&&**父节点的左孩子节点的右孩子节点是否为空。

满足这三个条件才是左叶子节点。

本题可以采用前中后序遍历来实现,也可以用递归来实现。

具体实现代码如下:

代码实现(C++)

迭代实现(深度优先遍历)

class Solution {
    
    
public:
    int sumOfLeftLeaves(TreeNode* root) 
    {
    
    
        stack<TreeNode*> st;
        if(root==nullptr)
        {
    
    
            return 0;
        }
        st.push(root);
        int res=0;
        while(!st.empty())
        {
    
    
            TreeNode* node=st.top();
            st.pop();
            if(node->left!=nullptr&&node->left->left==nullptr&&node->left->right==nullptr)
            {
    
    
                res+=node->left->val;
            }
            if(node->right)
            {
    
    
                st.push(node->right);
            }
            if(node->left)
            {
    
    
                st.push(node->left);
            }
            
        }
        return res;



    }
};

递归实现(深度优先遍历)

class Solution {
    
    
public:
    int sumOfLeftLeaves(TreeNode* root) 
    {
    
    
        if(root==nullptr)
        {
    
    
            return 0;
        }
        int leftnum=sumOfLeftLeaves(root->left);
        int rightnum=sumOfLeftLeaves(root->right);
        int temp=0;
        if(root->left!=nullptr&&root->left->left==nullptr&&root->left->right==nullptr)
        {
    
    
            temp+=root->left->val;
        }
        int res=temp+leftnum+rightnum;
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45847364/article/details/122082775