404. 二叉树左叶子之和
给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0
算法需要有个返回结果,套路算法框架(需借助辅助函数):
public int sumOfLeftLeaves(TreeNode root) {
return sumOfLeftLeaves(root, 0);
}
public int sumOfLeftLeaves(TreeNode root, int sum) {
}
当遍历到某个节点时,此节点需要做什么?
1.若节点为空,结束遍历
2.若节点不为空
2.1)若节点的左子节点和右子节点都为空,节点是根节点,则结束遍历
2.2)若节点的左子节点不为空
2.2.1)若左子节点是叶子节点,则该左子节点是左叶子节点,累加左子节点的值到结果中
2.2.2)若左子节点不是叶子节点,则继续遍历左子节点
2.3)若节点的右子节点不为空
2.3.1)若右子节点是叶子节点,则结束遍历
2.3.2)若右子节点不是叶子节点,则继续遍历右子节点
public int sumOfLeftLeaves(TreeNode root, int sum) {
if (root == null) {
return sum;
}
if (root.left == null && root.right == null) {
return sum;
}
if (root.left != null) {
if (root.left.left == null && root.left.right == null) {
// 左子节点是叶子节点
sum = sum + root.left.val;
} else {
// 左子节点不是叶子节点,继续遍历左子节点
sum = sumOfLeftLeaves(root.left, sum);
}
}
if (root.right != null) {
if (root.right.left == null && root.right.right == null) {
// 右子节点是叶子节点,结束遍历
return sum;
} else {
// 右子节点不是叶子节点,继续遍历右子节点
sum = sumOfLeftLeaves(root.right, sum);
}
}
return sum;
}