力扣第404题 左叶子之和 c++ 递归 与 迭代解法

题目

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

思路和解题方法一(递归)

  1. 首先判断当前节点是否为空,如果为空,返回0。
  2. 递归计算左子树中所有左叶子节点的和,将结果保存在变量lsum中。
  3. 判断当前节点的左子节点是否存在,并且左子节点没有左孩子和右孩子(即为左叶子节点),如果满足条件,将当前左叶子节点的值赋给lsum
  4. 递归计算右子树中所有左叶子节点的和,将结果保存在变量rsum中。
  5. 计算当前节点的左叶子节点的和,即lsum + rsum,并返回。

通过递归调用,最终会计算出二叉树中所有左叶子节点的和。

复杂度

        时间复杂度:

                O(n)

时间复杂度为O(n),其中n是二叉树中的节点数。

        空间复杂度

                O(n)

空间复杂度:
这个递归函数使用了栈来存储递归调用的上下文。由于二叉树的深度可能非常大,因此递归调用的栈空间取决于二叉树的深度。在最坏的情况下,如果二叉树是倾斜的,即所有节点都在左子树或右子树中,那么递归调用的栈空间将是O(n)。因为需要为每个递归调用分配栈空间,所以空间复杂度是O(n)。

c++ 代码

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) { // 定义一个函数来计算二叉树中左叶子结点之和
        if (root == nullptr) return 0; // 如果当前节点为空,则返回0
        int lsum = sumOfLeftLeaves(root->left); // 递归计算左子树的左叶子结点之和
        if(root->left != nullptr&&root->left->left ==nullptr && root->left->right==nullptr)
            // 如果当前节点的左孩子存在且没有左右子节点,即为左叶子节点
        {
            lsum = root->left->val; // 将当前左叶子节点的值赋给lsum
        }
        int rsum = sumOfLeftLeaves(root->right); // 递归计算右子树的左叶子结点之和
        int sum  =  lsum + rsum; // 计算当前节点中所有左叶子结点之和
        return sum; // 返回当前节点中所有左叶子结点之和
    }
};

思路和解题方法二(迭代)

  1. 首先创建一个栈st,用于存储待处理的节点。
  2. 判断根节点root是否为空,如果为空,返回0。
  3. 将根节点root压入栈st中。
  4. 初始化结果变量result为0。
  5. 进入循环,直到栈st为空:
    • 弹出栈顶元素,并将其赋给临时变量node,表示当前处理的节点。
    • 如果node的左孩子存在,并且左孩子没有左右子节点(即为左叶子节点),将左叶子节点的值累加到result中。
    • 如果node有左孩子,将左孩子压入栈st中,以便后续处理。
    • 如果node有右孩子,将右孩子压入栈st中,以便后续处理。
  6. 循环结束后,返回结果变量result,即为二叉树中所有左叶子节点的和。

通过使用栈进行迭代,遍历并处理每个节点,最终求得二叉树中所有左叶子节点的和。

复杂度

        时间复杂度:

                O(n)

时间复杂度是O(n),其中n是二叉树的节点数。因为要对每个节点进行一次入栈和出栈操作,并且还要对每个节点的左子节点进行一次检查。

        空间复杂度

                O(n)

空间复杂度是O(n)。

c++ 代码

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        stack<TreeNode*> st; // 定义一个存储节点指针的栈,用于迭代遍历二叉树
        if (root == nullptr) return 0; // 如果二叉树为空,则直接返回0
        st.push(root); // 将根节点压入栈中
        int res = 0; // 初始化结果变量为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->left != nullptr) st.push(node->left); // 如果当前节点存在左孩子节点,则将其压入栈中
            if (node->right != nullptr) st.push(node->right); // 如果当前节点存在右孩子节点,则将其压入栈中
        }
        return res; // 返回最终结果
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

posted @   lenyan~  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示