java数据结构与算法刷题-----LeetCode513. 找树左下角的值

news/2024/7/20 23:13:05 标签: java, 深度优先, leetcode, 算法
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

1. 深度优先

解题思路
  1. 深度优先遍历左结点,获得可到达的最左结点高度A
  2. 然后递归向上继续深度优先
  3. 如果递归向上过程,没有发现比A高的高度,那么最开始的那个左节点就是我们要找的
  4. 但如果我们发现比A高的,那么我们优先进入更高层。而因为我们先深度遍历左节点。所以就算进入更高层,依然是获得当前结点的可到达的最左结点B,然后更新高度为B。继续递归向上。
  5. 直到遍历完成,注意只有高度更高时,才更新
代码

在这里插入图片描述

java">/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int curVal = 0;//遍历过程中,当前最左结点
    int curHeight = 0;//遍历过程中,当前最左结点的层次
    public int findBottomLeftValue(TreeNode root) {
        dfs(root,0);//第0层开始遍历
        return curVal;
    }
    public void dfs(TreeNode root,int height) {
        if(root == null) return;//如果当前结点为空,直接返回
        //不为空就进行深度优先遍历.有下一层就去下一层
        height++;
        //先找左
        dfs(root.left,height);//遍历左子树,层级+1
        //如果右边的层级更高,优先高层级
        dfs(root.right,height);//遍历右子树,层级+1
        if(height > curHeight){//如果当前层的深度比记录的深
            curHeight = height;//更新
            curVal = root.val;//更新
        }
    }
}

2. 广度优先

解题思路:所有结点遍历一遍的情况下,广度优先比深度优先慢一倍.因为入队列出队列,每个结点访问两次
  1. 广度优先,就相当于层级遍历,正好适合这道题
  2. 每一层我们从右到左遍历,当遍历到最后一个结点时,正好是最后一层的最左边结点
  3. 所以我们要先入队列右节点,然后在入队列左节点,和一般情况下,从左到右层级遍历是反过来的。这点要注意
代码

在这里插入图片描述

java">class Solution {
    public int findBottomLeftValue(TreeNode root) {
        int ret = 0;//保存结果
        Queue<TreeNode> queue = new ArrayDeque<TreeNode>();//广度优先队列
        queue.offer(root);//先入队列根节点
        while (!queue.isEmpty()) {//如果还有的遍历的话就继续
            TreeNode p = queue.poll();//出队列结点
            //注意我们要每一层最左结点。则右边的结点应该先遍历,然后遍历左边
            //这样最后才能知道,留下的是左边的结点
            if (p.right != null) {//如果有右子树,先右,否则会先把左,出队列,我们就无法获取当前层左下角的值了
                queue.offer(p.right);
            }
            if (p.left != null) {//左节点后出,才能在当前层遍历完成后,得到是左边的结点
                queue.offer(p.left);
            }
            ret = p.val;//保存值,因为左节点是后入队列的,所以最后会保存到最左的结点
        }
        return ret;
    }
}

http://www.niftyadmin.cn/n/5390233.html

相关文章

react + Typescript 中 react有多少内置的类型 分别是什么

react Typescript 中 react有多少内置的类型 分别是什么 React 和 TypeScript 结合使用时&#xff0c;React 提供了一系列的内置类型&#xff08;也称为类型定义或类型别名&#xff09;来帮助你在 TypeScript 中编写类型安全的代码。这些类型定义涵盖了 React 的各个方面&…

【数据结构】每天五分钟,快速入门数据结构(二)——链表

目录 一 构建一个单向链表 二 特点 三 时间复杂度 四 相关算法 1.判断链表是否成环及成环位置 2.链表反转 五 Java中的LinkedList 类 1.使用 2.LinkedList 方法 一 构建一个单向链表 // 设计链表结构class ListNode {int val;ListNode next;ListNode(){}ListNode(int…

邓俊辉 c++数据结构第二章 向量

数据结构是计算机存储、组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构分为&#xff1a;线性结构、线性结构和非线性结构。 线性结构根据逻辑次序和物理次序的关系&#xff0c;分为向量和列表。向量的逻辑次序和物理位置是对应的&#xff1b;列…

【高频SQL题目】再做一遍 1164.指定日期的产品价格

题目要求&#xff1a; 产品数据表: Products ------------------------ | Column Name | Type | ------------------------ | product_id | int | | new_price | int | | change_date | date | ------------------------ (product_id, change_date)…

飞天使-linux操作的一些技巧与知识点7-devops

文章目录 简述devopsCICD 简述devops 让技术团队&#xff0c;运维&#xff0c;测试等团队实现一体式流程自动化 进阶版图 CICD 持续集成&#xff0c; 从编译&#xff0c;测试&#xff0c;发布的完成自动化流程 持续交付&#xff0c;包含持续集成&#xff0c;并且将项目部署…

基于springboot+vue的安康旅游网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

国家建筑装配式内装产业基地在沪成立,副主任单位优积科技协同助推绿色低碳循环发展

上海市室内装饰行业协会装配式内装产业专业委员会成立大会暨“国家建筑装配式内装产业基地”项目启动会于3月21日下午1点在上海光大酒店隆重举行。出席此次活动的包括市装协会长徐国俭&#xff0c;市装协党支部书记兼秘书长丛国梁&#xff0c;市装协装配式内装委主任顾泰昌&…

Spring Boot面试题解析

1. 什么是 Spring Boot&#xff1f;【重点】 多年来&#xff0c;随着新功能的增加&#xff0c;Spring变得越来越复杂&#xff1b;一个Spring项目&#xff0c;我们必须做添加构建路径或添加Maven依赖关系&#xff0c;配置应用程序服务器&#xff0c;添加Spring配置等工作&#…