题目描述
给定二叉树的根节点 root ,返回所有左叶子节点值之和。
解题思路
这道题乍一看不算难,但是需要注意一个坑,不是所有的左节点的值之和,而是左叶子节点之和,相信有很多小伙伴一开始都理解错了。比如说:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。
层序遍历
这道题的解法有很多,首先是利用层序遍历的方法,具体代码如下:
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()) {
int len = queue.size();
for (int i = 0; i < len; i ++) {
TreeNode tempNode = queue.poll();
if (tempNode.left != null) {
queue.offer(tempNode.left);
//注意这里,要看左孩子的左右节点是否为空。
if (tempNode.left.left == null && tempNode.left.right == null)
sum += tempNode.left.val;
}
if (tempNode.right != null)
queue.offer(tempNode.right);
}
}
return sum;
}
}
前序遍历
前序遍历的方法更容易理解一些,利用栈先入后出的特性来遍历左右孩子节点,具体代码如下:
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
Stack<TreeNode> stack = new Stack<> ();
stack.add(root);
int result = 0;
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.left != null && node.left.left == null && node.left.right == null) {
result += node.left.val;
}
if (node.right != null) stack.add(node.right);
if (node.left != null) stack.add(node.left);
}
return result;
}
}