力扣:找树左下角的值java

力扣:找树左下角的值java

在这里插入图片描述
两种方法:迭代法使用层序遍历递归前中后都可以(中操作为空)。

流程:

首先是层序遍历
1.设置一个对列,根节点入队列(相当于输入第一层)
2.循环每层,计算对列的size(相当于记录每层有多少个节点)。
3.设置循环内循环,对列poll()出size个元素,对改层的第一个元素赋与结果值,再将每个元素判断左右孩子不为空,就输入左右孩子节点到对列。
4.最后返回记录的结果值

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();//设置一个对列
        queue.offer(root);//根节点入队列
        int result=0;//结果值
        while(!queue.isEmpty()){//对列不空说明还有层未遍历
            int size = queue.size();//记录该层的节点数量
            for(int i =0;i<size;i++){//不断poll出该层的所有元素,并将该层元素的所有左右孩子输入对列
                TreeNode node = queue.poll();
                if(i==0) result=node.val;//记录该层的第一个节点赋予结果值
                if(node.left!=null) queue.offer(node.left);//将左右孩子加入对列中
                if(node.right!=null) queue.offer(node.right);
            }
        }
        return result;
    }
}

其次是递归遍历,前中后都一样,中操作为空。
递归三部曲:
返回值和参数:无需返回值,结果直接记录在类中,参数为根节点和当前层数。
结束条件:遇到叶子节点(判断叶子节点是否是当前最大深度下的叶子节点,不是则将该深度赋予最大深度,值赋予结果值)
单层递归逻辑:节点的左孩子不为空则对当前深度deep++,然后调用递归函数,参数为左孩子和deep,最后要对deep–(这是回溯的过程,因为左孩子递归结束了,就要回到当前深度,第二个参数也可以写成deep+1效果相同)。
节点的右孩子不为空则对当前深度deep++,然后调用递归函数,参数为右孩子和deep,最后要对deep–(这是回溯的过程,因为左孩子递归结束了,就要回到当前深度,第二个参数也可以写成deep+1效果相同)

class Solution {
    int maxDeep = Integer.MIN_VALUE;//当前最大深度值
    int result;//结果值
    public int findBottomLeftValue(TreeNode root) {//主函数
        findL(root,1);//调用递归函数
        return result;
        
    }
    public void findL(TreeNode node,int deep){//递归函数,参数为根节点和当前深度
        if(node.left == null&&node.right == null){//结束条件,遇到叶子结点
            if(deep>maxDeep){//判断该叶子节点深度是否大于最大深度
            //大于则最大深度值赋值为该深度值,该节点的值记录为结果值
            //只记录第一次,之后在遇到该层的因为最大深度已经不是大于了,并且每次先遍历左孩子,所以记录的就是最左的叶子节点
                maxDeep = deep;
                result = node.val;
            }
        }
        if(node.left!=null){//前面没有判空的操作,所以要判断节点左右孩子是否不为空
            deep++;//deep加一,是为了在调用的时候给子节点深度加一
            findL(node.left,deep);
            deep--;//回溯操作,遍历完左节点,就要让deep回到当前深度
        }
        if(node.right!=null){
            deep++;
            findL(node.right,deep);
            deep--;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值