404. 左叶子之和

注意审题啊。。是叶子而不是单纯的节点。
然后要通过父节点才能判断出是不是叶子节点。

卡哥的正经后序递归写法

  1. var sumOfLeftLeaves = function(root) {
  2. //采用后序遍历 递归遍历
  3. // 1. 确定递归函数参数
  4. const nodesSum = function(node){
  5. // 2. 确定终止条件
  6. if(node===null){
  7. return 0;
  8. }
  9. let leftValue = sumOfLeftLeaves(node.left);
  10. let rightValue = sumOfLeftLeaves(node.right);
  11. // 3. 单层递归逻辑
  12. let midValue = 0;
  13. if(node.left&&node.left.left===null&&node.left.right===null){
  14. midValue = node.left.val;
  15. }
  16. let sum = midValue + leftValue + rightValue;
  17. return sum;
  18. }
  19. return nodesSum(root);
  20. };

我的半吊子递归(总感觉跟迭代法有点混合了,看下方)

  1. // 审题!是左叶子而不是左节点!
  2. var sumOfLeftLeaves = function(root) {
  3. let res =0;
  4. // 递归
  5. const computeLeft =function(root){
  6. if(!root) return res;
  7. if(root.left&&!root.left.left&&!root.left.right){
  8. res +=root.left.val;
  9. }
  10. computeLeft(root.left);
  11. computeLeft(root.right);
  12. }
  13. computeLeft(root);
  14. return res;
  15. };

迭代

  1. var sumOfLeftLeaves = function(root) {
  2. //采用层序遍历
  3. if(root===null){
  4. return null;
  5. }
  6. let queue = [];
  7. let sum = 0;
  8. queue.push(root);
  9. while(queue.length){
  10. let node = queue.shift();
  11. if(node.left!==null&&node.left.left===null&&node.left.right===null){
  12. sum+=node.left.val;
  13. }
  14. node.left&&queue.push(node.left);
  15. node.right&&queue.push(node.right);
  16. }
  17. return sum;
  18. };