404. 左叶子之和

image.png
image.png

递归

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public int sumOfLeftLeaves(TreeNode root) {
  18. /**
  19. 递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。。
  20. 递归三部曲:
  21. 确定递归函数的参数和返回值
  22. 判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int
  23. 使用题目中给出的函数就可以了。
  24. 确定终止条件
  25. 依然是
  26. if (root == NULL) return 0;
  27. 确定单层递归的逻辑
  28. 当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
  29. */
  30. if(root == null ) return 0;
  31. int leftValue = sumOfLeftLeaves(root.left); //左
  32. int rightValue = sumOfLeftLeaves(root.right); //右
  33. // 中
  34. int midValue = 0;
  35. if(root.left != null && root.left.left == null && root.left.right == null ) {
  36. midValue = root.left.val;
  37. }
  38. int sum = midValue + leftValue + rightValue;
  39. return sum;
  40. }
  41. }

迭代

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public int sumOfLeftLeaves(TreeNode root) {
  18. //迭代
  19. //模拟先序遍历
  20. if(root == null ) return 0;
  21. Stack<TreeNode> stack = new Stack<>();
  22. stack.push(root);
  23. int sum = 0;
  24. while(! stack.isEmpty() ) {
  25. TreeNode node = stack.pop();
  26. if(node.left != null && node.left.left == null && node.left.right == null ) {
  27. sum += node.left.val;
  28. }
  29. if(node.right != null ) stack.push(node.right);
  30. if(node.left != null ) stack.push(node.left);
  31. }
  32. return sum;
  33. }
  34. }

层级遍历

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public int sumOfLeftLeaves(TreeNode root) {
  18. //层级遍历
  19. if(root == null) return 0;
  20. Queue<TreeNode> que = new LinkedList<>();
  21. que.add(root);
  22. int sum =0;
  23. while(! que.isEmpty() ) {
  24. int size = que.size();
  25. while(size > 0) {
  26. TreeNode node = que.poll();
  27. if(node.left != null && node.left.left == null && node.left.right == null ) sum += node.left.val;
  28. if(node.left != null ) que.add(node.left);
  29. if(node.right != null) que.add(node.right);
  30. size --;
  31. }
  32. }
  33. return sum;
  34. }
  35. }