代码随想录二刷 | 二叉树 |404.左叶子之和
- 题目描述
- 解题思路
- 递归法
- 迭代法
- 代码实现
- 递归法
- 迭代法
题目描述
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
解题思路
左叶子:节点 A 的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么 A 节点的左孩子为左叶子节点。
那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下:
if (node->left != NULL && node->left->left != NULL && node->left->right != NULL) {左叶子节点处理逻辑
}
因为要通过递归函数的返回值来累加求取左叶子数值之和,所以使用后序遍历(左右中)。
递归法
递归三部曲
- 确定递归函数的参数和返回值
传入的参数为根节点,递归函数的返回值为节点的数值之和,所以返回值为int
,使用题目给的函数即可。int sumOfLeftLeaves(TreeNode* root){}
- 确定递归的终止条件
遍历到空节点那么左叶子值一定为0。同时因为要从父节点开始判断,所以如果遍历到了叶子节点,那么它的左叶子也为0if (root +== NULL) return 0; if (root->left == NULL && root->right == NULL) return 0;
- 确定单层递归的逻辑
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和右子树左叶子之和,相加便是整个树的左叶子之和。int leftValue = sumOfLeftLeaves(root->left); if (node->left != NULL && node->left->left != NULL && node->left->right != NULL) {leftValue = root->left->val; } int rightValue = sumOfLeftLeaves(root->right); int sum = leftValue + rightValue; return sum;
迭代法
迭代法前中后序遍历都可以,只要将左叶子节点统计出来即可,为了统一,依然使用后序遍历。
代码实现
递归法
class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (root == NULL) return 0;if (root->left == NULL && root->right == NULL) return 0;int leftValue = sumOfLeftLeaves(root->left);if (root->left && !root->left->left && !root->left->right) {leftValue = root->left->cal;}int rightValue = sumOfLeftLeaves(root->right);int sum = leftValue + rightValue;retrun sum;}
};
迭代法
// 后序遍历:左右中
// 入栈顺序:中右左
class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {queue<TreeNode*> st;if (root == NULL) return 0;st.push(root);int result = 0;while (!que.empty()) {TreeNode* node = st.top();st.pop();if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {result += node->left->val;}if (node->right) st.push(node->right);if (node->left) st.push(node->left);}return result;}
};