叶子节点之和问题

左叶子节点之和

题目描述

力扣链接🔗

左叶子节点之和 - 图1

代码分析

此题最重要的思路就是求左叶子节点,如果该节点的左叶子节点不为空,且左叶子节点的左右节点为空,那么该左节点就是叶子节点

递归法

  1. 确认函数返回值和参数
    判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int使用题目中给出的函数就可以了。
  2. 确认中止条件
    在节点为空时,此时左右节点没有值,返回和为0。
  3. 单层循环逻辑
    当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
  1. /**
  2. * 递归法
  3. * @param root
  4. * @return
  5. */
  6. public int sumOfLeftLeaves(TreeNode root) {
  7. int sum = 0;
  8. if (root == null) {
  9. return 0; // 递归停止的条件
  10. }
  11. int leftSum = 0, rightSum = 0;
  12. if (root.left != null) {
  13. rightSum = sumOfLeftLeaves(root.left); // 左孩子的所有左叶子节点之和
  14. }
  15. if (root.right != null) {
  16. leftSum = sumOfLeftLeaves(root.right); // 右孩子的所有左叶子节点之和
  17. }
  18. int midValue = 0;
  19. if (root.left != null && root.left.left == null && root.left.right == null) {
  20. midValue += root.left.val; // 如果左节点的左右节点都为空,那么此左节点就是左叶子节点
  21. }
  22. sum = midValue + leftSum + rightSum; // 左节点的左叶子节点之和加上右节点的做叶子节点之和即为此节点的做叶子节点之和
  23. return sum;
  24. }

迭代法

  1. /**
  2. * 前序迭代法
  3. *
  4. * @param root
  5. * @return
  6. */
  7. public int sumOfLeftLeaves(TreeNode root) {
  8. Stack<TreeNode> stack = new Stack<>();
  9. int sum = 0;
  10. if (root == null) {
  11. return sum;
  12. }
  13. stack.push(root);
  14. while (!stack.isEmpty()) {
  15. TreeNode node = stack.pop();
  16. if (node.right != null) {
  17. stack.push(node.right);
  18. }
  19. if (node.left != null) {
  20. stack.push(node.left);
  21. }
  22. if (node.left != null && node.left.left == null && node.left.right == null) {
  23. sum += node.left.val;
  24. }
  25. }
  26. return sum;
  27. }

层序遍历法

层次遍历,也是找到节点左孩子的左右节点为空的节点。

  1. /**
  2. * 层序遍历
  3. *
  4. * @param root
  5. * @return
  6. */
  7. public int sumOfLeftLeaves(TreeNode root) {
  8. int sum = 0;
  9. if (root == null) {
  10. return sum;
  11. }
  12. Queue<TreeNode> queue = new LinkedList<>();
  13. queue.offer(root);
  14. while (!queue.isEmpty()) {
  15. int len = queue.size();
  16. while (len-- > 0) {
  17. TreeNode node = queue.poll();
  18. if (node.left != null) queue.offer(node.left);
  19. if (node.right != null) queue.offer(node.right);
  20. if (node.left != null && node.left.left == null && node.left.right == null) sum += node.left.val;
  21. }
  22. }
  23. return sum;
  24. }

前序遍历

  1. /**
  2. * 迭代遍历
  3. *
  4. * @param root
  5. * @return
  6. */
  7. public int sumOfLeftLeaves(TreeNode root) {
  8. if (root == null) {
  9. return 0;
  10. }
  11. Stack<TreeNode> stack = new Stack<>();
  12. stack.push(root);
  13. int sum = 0;
  14. while (!stack.isEmpty()) {
  15. TreeNode node = stack.pop();
  16. if (node.left != null && node.left.left == null && node.left.right == null) {
  17. sum += node.val;
  18. }
  19. if (node.left != null) stack.push(node.left);
  20. if (node.right != null) stack.push(node.right);
  21. }
  22. return sum;
  23. }