这道题的要求是所有左叶子节点之和,即只要是左节点就应该被算在内,题解的答案真的是非常的简单粗暴,看一下:
public int sumOfLeftLeaves(TreeNode root) { if(root == null) return 0; if(isLeaf(root.left)) return root.left.val + sumOfLeftLeaves(root.right); return sumOfLeftLeaves(root.left) + sumOfLeftLeaves( root.right); } public boolean isLeaf(TreeNode head) { if ( head == null) return false; return head.left==null && head.right ==null; }
不得不说,这道题的题解真的是太简单粗暴了,我什么时候能把递归用成这样就好了!
如果root是null的话 没有左子节点,所以直接返回0;
同样也是递归的出口,就是如果这个节点的左节点/右节点为null了,返回0就可以了,不用继续递归了。
而下面这句 if(isLeaf(root.left)) 就是在往下递归的过程中,碰到了左子节点就加起来,然后这时候只需要递归右边的节点就ok了,
如果不是左子节点的话,那么需要将左右都看成是本函数空间的根节点递归的进行计算。太妙了!
这段代码其实是从上往下递归计算的,和之前最大最小路径的从下往上递归计算思路上有所区别;