题目:
思路:遍历该树,遍历每个节点时只需要加以判断当前节点的左子节点是不是叶子节点即可。
下面分别给出了深度优先遍历和广度优先遍历代码实现:
dfs实现:
int sum = 0;
public int sumOfLeftLeaves(TreeNode root) {
if(root == null){
return 0;
}
//判断当前节点的的左节点是不是叶子节点
if(root.left != null){
if(root.left.left == null && root.left.right == null){
sum += root.left.val;
}
}
//递归左右子树
sumOfLeftLeaves(root.left);
sumOfLeftLeaves(root.right);
return sum;
}
bfs实现:
public int sumOfLeftLeaves(TreeNode root) {
if(root == null){
return 0;
}
int sum = 0;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
//判断node的左节点是否为空在判断叶子节点,否则会报空指针
if(node.left != null){
if(isLeafNode(node.left)){
sum += node.left.val;
}else{
//如果不是叶子节点需要加入queue,切记
queue.offer(node.left);
}
}
//node的右子节点如果是叶子节点就没必要加入queue了
if(node.right != null){
if(!isLeafNode(node.right)){
queue.offer(node.right);
}
}
}
return sum;
}
//判断是不是叶子节点
public boolean isLeafNode(TreeNode node){
return node.left == null && node.right == null;
}