leetcode 二叉树专题——java实现

news2024/12/28 23:49:20

1. 二叉树中序遍历

给一棵树,输出中序遍历。
树已经给你建好了,按照一下形式:

/**
 * 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;
 *     }
 * }
 */

样例:[1,null,2,3]
输出:[1,3,2]

(1)递归实现:(俺的,耗时长)


class Solution {
     List<Integer> list = new ArrayList<Integer>();
    void show_mid(TreeNode r){
        if(r==null) return ;
        if(r!=null){
            show_mid(r.left);
            list.add(r.val);
            show_mid(r.right);
        }
    }
    public List<Integer> inorderTraversal(TreeNode root) {
        //输入先序,输出中序
        show_mid(root);
        return list;
    }
}

(2)栈
按照:右子节点、自身、左子节点依次入栈,访问后做标记。

想要这样输出:
前序遍历:中,左,右
中序遍历:左,中,右
后序遍历:左,右,中
就要倒着入栈。
public List<Integer> inorderTraversal(TreeNode root){
    List<Integer> res = new ArrayList<>();
    Deque<Object> stack = new LinkedList<>();
    if(root == null) return res;
    stack.push("WHITE");
    stack.push(root);
    while(!stack.isEmpty()){
       TreeNode node = (TreeNode)stack.pop();
       String color = (String)stack.pop();
       if (node == null) continue;
       if(color == "WHITE"){
           stack.push("WHITE");
           stack.push(node.right);
           stack.push("GRAY");
           stack.push(node);
           stack.push("WHITE");
           stack.push(node.left);
       }else{
           res.add(node.val);
       }
    }
    return res;
}

2.二叉树的最大深度

求树的高度
递归求数高度(不够快)

class Solution {
    int get_height(TreeNode t){
        if(t==null){
            return 0;
        }
        return Math.max(get_height(t.left),get_height(t.right))+1;
    }
    public int maxDepth(TreeNode root) {
        return get_height(root);

    }
}

108. 将有序数组转换为平衡二叉搜索树

你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树

class Solution {
    TreeNode create(int[] a,int l,int r){
        if(l>r) return null;
        TreeNode t=new TreeNode();
        int mid=(l+r)/2;
        t.val=a[mid];
        t.left=create(a,l,mid-1);
        t.right=create(a,mid+1,r);
        return t;
    }
    public TreeNode sortedArrayToBST(int[] nums) {
        //建立平衡二叉树,返回树
        //数组已经排好序了,直接利用它建树
        //中间为根,左边为左子树,右边为右子树
        return create(nums,0,nums.length-1);
    }
}

226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

这题关键点在于:是整个树的镜像,所以先左右子树交换,再一步步往下进行交换【先交换后递归】。

class Solution {
    void inverse(TreeNode t){
        if(t==null) return ;
        TreeNode temp;
        temp=t.left;
        t.left=t.right;
        t.right=temp;
        inverse(t.left);
        inverse(t.right);
    }
    public TreeNode invertTree(TreeNode root) {
        //返回树
        //由于是一整个镜像,所以从头开始就将左右两个子树翻转
        inverse(root);
        return root;

    }
}

二叉树层序遍历

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
重点在于要一层层分出来
在这里插入图片描述
用levelEnd记录每层最后一个节点的编号,注意上一层最后的节点与这层最后节点没有直接关系,所以要用数组中front指代的点。
(明明难度是简单,但我做了好久。)

class Solution {
    
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> listALL = new ArrayList<List<Integer>>();
        
        //再层序遍历时换需要标记处在哪开始下一层
        TreeNode[] qu=new TreeNode[2050];
        int front=0,base=0;
        int levelEnd=0;
        if(root==null) return listALL;
        qu[front++]=root;//先把根节点放进去
        int k=0;//用来记录ListALL里的第一个list
        listALL.add(new ArrayList<Integer>());
        while(front>base){
            TreeNode t=qu[base++];
            // System.out.println(t.val);
            listALL.get(k).add(t.val);

            if(t.left!=null) qu[front++]=t.left;
            if(t.right!=null) qu[front++]=t.right;
            if(base-1==levelEnd){
                //当前为层末尾
                // for (Integer s: list1) {
                //     System.out.print(s);
                // }
                //  System.out.println();
                listALL.add(new ArrayList<Integer>());//层list放List里
                levelEnd=front-1;//记住当前末尾节点在数组里的位置
                 System.out.println(levelEnd);
                 k++;
            }
        }
        if(listALL.get(k).isEmpty()) listALL.remove(listALL.get(k));//把最后一个空的[]移除
        return listALL;

    }
}

101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。
输入:root = [1,2,2,3,4,4,3]
输出:true
关键点:将一棵树的判断对称,转变成两棵树,一颗的左枝叶对应另一颗右枝叶。

class Solution {
    boolean Isame(TreeNode t1,TreeNode t2){
        if(t1==null&&t2==null) return true;//全为空 T
        if(t1==null||t2==null) return false;//其中一个为空 F
        if(t1.val==t2.val) {
            if(Isame(t1.left,t2.right)&&Isame(t1.right,t2.left)) 
                return true;
            else return false;
        }
        return false;
        
       
    }
    public boolean isSymmetric(TreeNode root) {
        return Isame(root,root);
    }
}

543. 二叉树的直径

给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
关键在于:本质就是遍历所有的点,找到以每个节点为根时左右子树的长度之和,送这些和中找maxx

//我的第一种写法:
//将找长度和遍历所有点分开,遍历使用先序遍历
class Solution {
    int maxx=-1;
    int getHeight(TreeNode t){
        //当前结点为根下最长的两个叶子,那一定在左右枝分别取到
        if(t==null) return 0;
        return Math.max(getHeight(t.right),getHeight(t.left))+1;
    }
    void showFirst(TreeNode t){
        if(t==null) return ;
        int l=0,r=0;
        if(t.left!=null){
            l=getHeight(t.left);
        }
        if(t.right!=null){
            r=getHeight(t.right);
        }
        if((l+r)>maxx) maxx=(l+r);

        showFirst(t.left);
        showFirst(t.right);
    }
    public int diameterOfBinaryTree(TreeNode root) {
        //两边的点决定的路径肯定有公共根节点
        //记录-以当前结点为根节点深度最深的两个叶子的深度之和,从记录中找到最长的
        
        //遍历每个树节点——先序遍历
        showFirst(root);
        return maxx;
    }
}

简化版,将遍历左右子树长度和,结合在一个函数中。

class Solution {
    int maxx=-1;
    int getHeight(TreeNode t){
        //当前结点为根下最长的两个叶子,那一定在左右枝分别取到
        if(t==null) return 0;
        //分别得到左右子树长度
        int l=getHeight(t.left);
        int r=getHeight(t.right);
        System.out.println(l+"+"+r);
        if((l+r)>maxx) maxx=(l+r);
        return Math.max(l,r)+1;//返回长度
    }
    
    public int diameterOfBinaryTree(TreeNode root) {
        int a = getHeight(root);
        return maxx;
    }
}

230. 二叉搜索树中第K小的元素

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。
输入:root = [3,1,4,null,2], k = 1
输出:1

class Solution {
    int x=-1,cnt=0;
    void search(TreeNode t,int k){
        if(t==null) return ;
        search(t.left,k);
        cnt++;
        if(cnt==k) x=t.val;

        search(t.right,k);
    }
    public int kthSmallest(TreeNode root, int k) {
        //二叉搜索树,左小右大
        //中序遍历从小到大
        search(root,k);
        return x;

    }
}

199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

class Solution {
    void cenEnd(TreeNode r){
        
    }
    public List<Integer> rightSideView(TreeNode root) {
        //右视图就是每层最后一个点,从头到尾放到list里
        //与我之前写的层序遍历类似
    List<Integer> list = new ArrayList<Integer>();
        TreeNode[] qu = new TreeNode[201];
        int front=0,base=0,levelEnd=0;
        if(root==null) return list;
        qu[front++]=root;
        while(front>base){
            TreeNode t=qu[base++];
            if(t.left!=null) qu[front++]=t.left;
            if(t.right!=null) qu[front++]=t.right;
            if(levelEnd==(base-1)){
                list.add(t.val);
                levelEnd=front-1;
            }
        }
        return list;

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

花10分钟写个漂亮的后端API接口模板!

你好&#xff0c;我是田哥 在这微服务架构盛行的黄金时段&#xff0c;加上越来越多的前后端分离&#xff0c;导致后端API接口规范变得越来越重要了。 比如&#xff1a;统一返回参数形式、统一返回码、统一异常处理、集成swagger等。 目的主要是规范后端项目代码&#xff0c;以及…

数据恢复大师免费版落伍了吗?2024年4大创新恢复工具对比评测

在这个数字时代&#xff0c;要是突然发现电脑里的珍贵照片、视频或者重要文件不见了&#xff0c;那种感觉就像失去了什么重要的东西&#xff0c;让人焦虑又无助。市面上虽然有很多数据恢复软件&#xff0c;但不是所有软件都能满足我们的需求&#xff0c;尤其是那些既免费又好用…

一键解析:由于找不到xinput1_3.dll,无法继续执行代码的问题,有效修复xinput1_3.dll文件

xinput1_3.dll是一个重要的动态链接库文件&#xff0c;它是DirectX软件包的一部分&#xff0c;主要负责处理游戏和多媒体应用程序中的输入功能。当用户尝试启动某些游戏或应用程序时&#xff0c;可能会遇到一个错误提示&#xff0c;指出“由于找不到xinput1_3.dll&#xff0c;无…

开源AI智能名片拓客小程序在企业品牌快速打造中的应用探索

摘要&#xff1a;在数字化浪潮席卷全球的今天&#xff0c;企业品牌的建设与传播已不再局限于传统的广告与营销手段。开源AI智能名片拓客小程序作为一种创新的数字营销工具&#xff0c;凭借其智能化、个性化及高效化的特点&#xff0c;正逐步成为企业品牌快速打造与提升市场影响…

游戏类型有哪些?游戏分类详细解说(一)

这篇文章是来源于游戏工委牵头制定的团体标准&#xff1a;《网络游戏分类》&#xff08;音数协 2023年1月&#xff0c;征求意见稿&#xff09;。 音数协游戏工委是游戏行业自律组织&#xff0c;在其牵头组织下&#xff0c;腾讯、网易、盛趣、索尼、完美世界、巨人网络等单位共…

MTK6983/MT6983天玑9000芯片详细性能参数_MTK联发科5G方案定制

联发科MT6983旗舰5G移动平台处理器集成了蓝牙、FM、WLAN 和 GPS 模块&#xff0c;是一个高度集成的基带平台&#xff0c;集成了调制解调器和应用处理子系统&#xff0c;可支持 LTE/LTE-A/NR 和 C2K 智能手机应用。 该芯片集成了四个 Arm Matterhorn (ELP) 内核、四个 Arm Klein…

Java | Leetcode Java题解之第304题二维区域和检索-矩阵不可变

题目&#xff1a; 题解&#xff1a; class NumMatrix {int[][] sums;public NumMatrix(int[][] matrix) {int m matrix.length;if (m > 0) {int n matrix[0].length;sums new int[m 1][n 1];for (int i 0; i < m; i) {for (int j 0; j < n; j) {sums[i 1][j …

视图库对接系列(GA-T 1400)二十二、视图库对接系列(级联)校时

背景 校时接口一般用的比较少&#xff0c;一般用的话就注册上级成功之后会发送 一个校时&#xff0c;告诉服务端目前客户端的时间情况。 实现 这个实现的话&#xff0c;我们再注册的时候就已经实现了&#xff0c;注册成功就会发送一次校时 先看抓包 具体实现代码 service接…

【转型必看】Java到AI,程序员的逆袭秘籍,转行人工智能不再是梦!

随着技术的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今科技领域最热门的话题之一。许多开发者开始考虑从传统的软件开发领域&#xff0c;如Java&#xff0c;转向人工智能领域&#xff0c;今天小编和大家一起来探讨Java开发者是否可以转型到人工智能&a…

「JavaEE」Spring IoC 1:Bean 的存储

&#x1f387;个人主页 &#x1f387;所属专栏&#xff1a;Spring &#x1f387;欢迎点赞收藏加关注哦&#xff01; IoC 简介 IoC 全称 Inversion of Control&#xff0c;即控制反转 控制反转是指控制权反转&#xff1a;获得依赖对象的过程被反转了 传统开发模式中&…

38 Debian如何配置Keepalived+LVS+NFS实现高可用负载均衡

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置Keepalived+LVS+NFS实现高可用负载均衡 《傅老师Debian知识库系列之38》——原创 ==前言== 傅老师Debian知识库特点: 1、拆解Debian实用技能; 2、所有操作在VMware虚拟机实测完成;…

C# Unity 面向对象补全计划 之 初识继承方法与多态

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 1.继承方法 C# & Unity 面向对象补全计划 之 继承&#xff08;字段与属性&…

什么是五力分析?5分钟带你了解它在企业财务经营中的应用与价值!

如今&#xff0c;随着全球化进程的不断加速&#xff0c;市场环境复杂多变&#xff0c;市场竞争日益激烈&#xff0c;财务经营已经成为了企业应对复杂市场环境、保持自身竞争力的关键。体系化的五力分析平台能够为企业提供一套全面的解决方案&#xff0c;帮助企业在盈利能力、偿…

重生奇迹MU 多准备几套装备才能玩得更好

一、时装必须是要准备一套的 我相信每个玩家都非常注重时装&#xff0c;无论是哪个职业&#xff0c;都希望在平常场合下穿上时髦惊艳的服装。在勇者大陆中&#xff0c;这种操作很常见&#xff0c;几乎所有玩家都需要准备一套。 在游戏中&#xff0c;需要具备一套适合的装备才…

Java实现数据库图片上传(包含从数据库拿图片传递前端渲染)-图文详解

目录 1、前言&#xff1a; 2、数据库搭建 &#xff1a; 建表语句&#xff1a; 3、后端实现&#xff0c;将图片存储进数据库&#xff1a; 思想&#xff1a; 找到图片位置&#xff08;如下图操作&#xff09; 图片转为Fileinputstream流的工具类&#xff08;可直接copy&#…

【C++】模板的特化

文章目录 概念函数模板特化类模板特化全特化偏特化 概念 通常情况下&#xff0c;使用模板可以实现一些与类型无关的代码&#xff0c;但是有一些类型需要特殊处理&#xff0c;否则可能会得到一些错误的结果。 比如&#xff0c;在比较两个数的大小时&#xff0c;如果传入两个变量…

RAG+AI工作流+Agent:LLM框架该如何选择,全面对比MaxKB、Dify、FastGPT、RagFlow、Anything-LLM,以及更多推荐

RAGAI工作流Agent&#xff1a;LLM框架该如何选择&#xff0c;全面对比MaxKB、Dify、FastGPT、RagFlow、Anything-LLM,以及更多推荐 1.MaxKB MaxKB Max Knowledge Base&#xff0c;是一款基于 LLM 大语言模型的开源知识库问答系统&#xff0c;旨在成为企业的最强大脑。它能够帮…

MySQL:存储引擎相关命令、性能比较

目录 存储引擎 概念 类型 示例 数据库文件 MylSAM .frm .MYD .MYI InnoDB .frm .ibd .opt 查看指定表的存储引擎类型 查看系统支持的存储引擎 修改存储引擎 通过配置文件指定存储引擎 使用alter修改 创建表的同时指定存储引擎 使用set命令临时指定存储引擎…

java入门-API学习

package API;//告诉编译器&#xff0c;编译之后应该放到哪个包里import API.try3.test3; import API.try3.test5; import itcast.test2;import java.util.Random; import java.util.Scanner;//导包 public class Introduce {public static void main(String[] args) {//别忘记写…

为何2024年这4款ai智能写作工具被赞为YYDS?

在数字化的大潮中&#xff0c;人工智能已经深入到我们生活的各个角落&#xff0c;当然也包括写作领域。随着ai智能写作工具的兴起&#xff0c;它们不仅显著提升了写作效率&#xff0c;还为创作打开了全新的可能性。今天&#xff0c;我们就来看看四款特别受欢迎的AI写作工具&…