题目
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
思路和解题方法一(递归)
- 首先判断当前节点是否为空,如果为空,返回0。
- 递归计算左子树中所有左叶子节点的和,将结果保存在变量
lsum
中。- 判断当前节点的左子节点是否存在,并且左子节点没有左孩子和右孩子(即为左叶子节点),如果满足条件,将当前左叶子节点的值赋给
lsum
。- 递归计算右子树中所有左叶子节点的和,将结果保存在变量
rsum
中。- 计算当前节点的左叶子节点的和,即
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; // 返回当前节点中所有左叶子结点之和
}
};
思路和解题方法二(迭代)
- 首先创建一个栈
st
,用于存储待处理的节点。- 判断根节点
root
是否为空,如果为空,返回0。- 将根节点
root
压入栈st
中。- 初始化结果变量
result
为0。- 进入循环,直到栈
st
为空:
- 弹出栈顶元素,并将其赋给临时变量
node
,表示当前处理的节点。- 如果
node
的左孩子存在,并且左孩子没有左右子节点(即为左叶子节点),将左叶子节点的值累加到result
中。- 如果
node
有左孩子,将左孩子压入栈st
中,以便后续处理。- 如果
node
有右孩子,将右孩子压入栈st
中,以便后续处理。- 循环结束后,返回结果变量
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; // 返回最终结果
}
};
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。