难度:easy
核心是判断左叶子节点(需要通过父节点判断):
只要父节点的左节点不为空,并且该左节点的左右子节点为空,则该左节点为左叶子节点。
// 只要能做到判断左叶子节点,只需要遍历即可完成本题
if (node.left != null && node.left.left == null && node.left.right == null) {
sum += node.left.val;
}
方法一:非递归前序遍历
// 非递归前序遍历
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
int sum = 0;
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.left != null && node.left.left == null && node.left.right == null) {
sum += node.left.val;
}
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
return sum;
}
}
方法二:层序遍历
// 层序遍历
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int sum = 0;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
// 只要能做到判断左叶子节点,只需要遍历即可完成本题
if (node.left != null && node.left.left == null && node.left.right == null) {
sum += node.left.val;
}
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
return sum;
}
}
方法三:递归
// 递归
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) {
return 0;
}
if (root.left == null && root.right == null) {
return 0;
}
int tem = 0;
if (root.left != null && root.left.left == null && root.left.right == null) {
tem = root.left.val;
}
int leftSum = sumOfLeftLeaves(root.left);
int rightSum = sumOfLeftLeaves(root.right);
return tem + leftSum + rightSum;
}
}