vlambda博客
学习文章列表

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;}