【算法刷题 | 二叉树 05】3.28(左叶子之和、找树 左下角的值)

在这里插入图片描述

11.左叶子之和

11.1问题

给定二叉树的根节点 root ,返回所有左叶子之和。

  • 示例一:

img

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

11.2解法一:递归

  1. 题目要求求左叶子之和,那什么是左叶子呢?
  2. 左叶子即:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
  3. 因此我们需要根据孩子的父节点来判断,该孩子是否为左叶子节点

11.2.1递归思路

  1. 递归遍历以root为根节点的树,求其左叶子之和
public int sumOfLeftLeaves(TreeNode root)
  1. 结束条件:
if(root==null){
	return 0;
}

//也可以不用加下面这段代码
//若为叶子节点则不用递归了,因为我们根据父节点来进行递归
if(root.left==null && root.right==null){
    return 0
}
  1. 递归逻辑
    1. 递归求左节点的左叶子之和
      1. 若该节点的左孩子为左叶子,即找到了以该节点为根节点的左叶子之和
    2. 递归求右节点的左叶子之和
int leftValue=sumOfLeftLeaves(root.left);
if(root.left!=null && root.left.left==null && root.left.right==null){
	leftValue=root.left.val;
}
int rightValue=sumOfLeftLeaves(root.right);
int sum = leftValue+rightValue;
return sum;

11.2.2代码实现

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        //递归
        if(root==null){
            return 0;
        }

        int leftValue=sumOfLeftLeaves(root.left);
        if(root.left!=null && root.left.left==null && root.left.right==null){
	        leftValue=root.left.val;
        }
        int rightValue=sumOfLeftLeaves(root.right);
        int sum = leftValue+rightValue;
        return sum;
    }
}

11.3解法二:栈

11.3.1栈思想

  1. 使用栈模拟实现递归
  2. 思想为中左右/中右左

11.3.2代码实现

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        //栈
        Stack<TreeNode> stack=new Stack<>();
        int sum=0;
        if(root==null){
            return sum;
        }
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node=stack.pop();
            if(node.left!=null && node.left.left==null && node.left.right==null){
                //该node节点的左孩子为左叶子
                sum+=node.left.val;
            }
            if(node.left!=null){
                stack.push(node.left);
            }
            if(node.right!=null){
                stack.push(node.right);
            }
        }
        return sum;
    }
    
}

12.找树左下角的值

12.1问题

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

  • 示例一:

img

输入: root = [2,1,3]
输出: 1

12.2解法一:层序遍历

  1. 只需在每层遍历的时候,标记最左边的元素即可
  2. 注意,节点的左右孩子的放入队列顺序:左孩子先(先进先出)
class Solution {
    public int findBottomLeftValue(TreeNode root) {
        //层序遍历
        int leftValue=0;
        if(root==null){
            return 0;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size=queue.size();
            for(int i=0;i<size;i++){
                TreeNode node=queue.poll();
                if(i==0){
                    //每一层的最左边
                    leftValue=node.val;
                }
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
            }
        }
        return leftValue;
    }
}

在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

个银二粒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值