Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等)

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
 

 

文章目录

        1.0 平衡二叉树

        1.1 实现判断平衡二叉树的思路

        1.2 代码实现判断平衡二叉树

        2.0 二叉树的层序遍历

        2.1 实现二叉树层序遍历的思路 

        2.2 代码实现二叉树层序遍历

        3.0 二叉树的最近公共祖先

        3.1 实现二叉树的最近公共祖先的思路

        3.2 代码实现二叉树的最近公共祖先

        4.0 根据二叉树创建字符串

        4.1 实现根据二叉树创建字符串的思路

        4.2 代码实现根据二叉树创建字符串


        1.0 平衡二叉树

题目:

        给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

OJ链接:

110. 平衡二叉树

        1.1 实现判断平衡二叉树的思路

        具体思路为:只需要判断当前节点的左右子树最大深度差是否大于 1 即可。利用递归的方式,来获取当前节点的最大深度,利用该节点的深度与另一个兄弟节点进行比较,若差值的绝对值对于 1 时,说明不是平衡二叉树

        1.2 代码实现判断平衡二叉树

/**
 * 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 {
    public boolean isBalanced(TreeNode root) {
        recursion(root);
        return sign;
    }

    public boolean sign = true;
    public int recursion(TreeNode node) {
        if(node == null) {
            return 0;
        }
        int l = recursion(node.left);
        int r = recursion(node.right);
        if(l < r) {
            int temp = l;
            l = r;
            r = temp;
        }
        if(l - r > 1) {
            sign = false;
        }
        return l + 1;

    }
}

        2.0 二叉树的层序遍历

        给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

OJ链接:

102. 二叉树的层序遍历

         2.1 实现二叉树层序遍历的思路 

        具体思路为:利用层序遍历来进行按照从上到下,从左到右的顺序来访问每一层的节点

        简单分析如何实现层序遍历:利用了队列的数据结构的特点,先进先出。那么先从根节点出发,将其压入队列中,接着判断从队列中弹出来的节点的左右孩子;若该节点的左孩子不为 null 时,将其压入队列中;若右孩子不为 null 时,将其压入队列中。循环往复,循环条件终止条件为:当队列为空时,说明已经把该树遍历完毕了。

        回来再来看,需要将不同层级的节点放到不同的容器中,那么就可以利用每一层节点的个数来实现将不同的层级的节点放到不同的容器中。简单来说,就是当前的层级有多少个节点数,然后将这些的节点收集到同一个容器中,实现该效果可以利用压入队列中的节点个数为循环条件,将其放到同一的容器中

        2.2 代码实现二叉树层序遍历

/**
 * 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 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null) {
            return new ArrayList();
        }
        List<List<Integer>> list = new ArrayList<>();
        LinkedList<TreeNode> queue = new LinkedList();
        queue.offer(root);
        while (!queue.isEmpty()) {

            List<Integer> list1 = new ArrayList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode poll = queue.poll();
                if (poll.left != null) {
                    queue.offer(poll.left);
                }
                if (poll.right != null) {
                    queue.offer(poll.right);
                }
                list1.add(poll.val);
            }
            list.add(list1);
        }
        return list;
    }
}

        3.0 二叉树的最近公共祖先

题目:

        给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

OJ链接:

236. 二叉树的最近公共祖先

         3.1 实现二叉树的最近公共祖先的思路

        具体思路为:一般分为两种情况,

        第一种,p 直接就是 q 的祖先或者 q 直接就是 p 的祖先。

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

        这属于是第一种情况,节点 5 就是节点 4 的最近公共祖先。因此节点 5 必定在节点 4 之前,所以只要遍历找到节点 5 ,就可以直接返回该节点,不需要再遍历下去了。当且仅当一个节点不为 null ,另一个节点为 null 时,肯定属于第一种情况

        第二种,互不为对方的祖先。

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

        这属于第二种情况,互不为对方的祖先。这也简单,只要通过递归来找到当前根节点的左右节点为 q 或者 p ,或者在当前的根节点中左右子树中可以找到的 q 或者 p 时,那么说明 q 与 p 同时都不为 null 时,当前的根节点就是他们最近的祖先节点。这就是属于第二种情况。

        3.2 代码实现二叉树的最近公共祖先

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == p || root == null || root == q) {
            return root;
        }
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        if(left != null && right != null) {
            return root;
        }
        return (left != null ? left : right);
        
    }
}

        4.0 根据二叉树创建字符串

题目:

        给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:

输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

OJ链接:

606. 根据二叉树创建字符串

        4.1 实现根据二叉树创建字符串的思路

        具体思路为:利用前序遍历得到的每一个节点的值拼接到可变字符串中,在拼接之前需要加上左括号,根节点开始从左子树遍历,若左子树遍历完,需要原路返回,判断当前节点的右子树有无节点,若有节点,则发生的是子问题过程了;若没有节点了,最后需要在可变中字符串拼接上右括号。

        4.2 代码实现根据二叉树创建字符串

/**
 * 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 {
    public String tree2str(TreeNode root) {
        recursion(root);
        return  string.substring(1,string.length()-1);

    }
    public StringBuilder string = new StringBuilder();
    public void recursion(TreeNode node) {
        string.append("(");
        string.append(node.val);
        if (node.left != null) {
            recursion(node.left);
        }else if(node.right != null) {
            string.append("()");
        }
        if (node.right != null) {
            recursion(node.right);
        }
        string.append(")");
    }   
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux开发工具--vim

Linux开发工具--vim 一、vim的基本概念二、常见命令三、简单配置vim配置文件的位置常用配置选项&#xff0c;用来测试使用插件 一、vim的基本概念 vim编辑器&#xff0c;只负责写代码&#xff0c;vim是一款多模式的编辑器 vim的三种模式(其实有好多模式&#xff0c;目前掌握这…

PbootCMS 前台RCE漏洞复现

0x01 产品简介 PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统,是一套高效、简洁、 强悍的可免费商用的PHP CMS源码,能够满足各类企业网站开发建设的需要 0x02 漏洞概述 PbootCMS v<=3.1.6版本中存在模板注入,攻击者可构造特定的链接利用该漏洞,执行…

跟着我学Python基础篇:06.列表

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 目录 往期文章1. 列表的基本…

ES-分析器

分析器 两种常用的英语分析器 1 测试工具 #可以通过这个来测试分析器 实际生产环境中我们肯定是配置在索引中来工作 GET _analyze {"text": "My Moms Son is an excellent teacher","analyzer": "english" }2 实际效果 比如我们有下…

win10脚本 | 使用 Word 自动化对象模型找出指定路径下含有特定内容的.docx

场景 今年的实验日志被我放在这样一个文件夹下&#xff0c;每个月下是每天具体的.docx文件&#xff0c;里面记录了我的一些实验操作步骤。现在我需要补充一个实验&#xff0c;用到一个名为chatunitest的插件&#xff0c;但是这是很久之前做的事情了&#xff0c;我无法判断是哪…

PHP 之道(PHP The Right Way 中文版)

PHP 之道&#xff08;PHP The Right Way 中文版&#xff09;

2022年重庆市职业院校技能大赛高职组“信息安全管理与评估”赛项竞赛任务书-试题01

信息安全管理与评估 第一阶段 网络平台搭建与设备安全防护 目 录 第一阶段竞赛项目试题 介绍 所需的设备、机械、装置和材料 评分方案 注意事项 项目和任务描述 1.网络拓扑图 2.IP地址规划表 工作任务 任务1&#xff1a;网络平台搭建 任务2&#xff1a;网络安全设备…

Find My手链|苹果Find My技术与手链结合,智能防丢,全球定位

手链是一种首饰&#xff0c;配戴在手腕部位&#xff0c;多为金银等金属制品&#xff0c;也有矿石、水晶等制的。手链是链状的&#xff0c;以祈求平安&#xff0c;镇定心志和美观为主要用途。手链可以展示个人的风格和品味&#xff0c;通过选择不同材质、款式和颜色的手链&#…

这样的性能测试面试题,测试开发来了都不见得会把?

14.1 性能测试怎么测试 性能测试其实就是通过自动化工具模拟多种正常、峰值以及异常负载来对系统的各项性能指标进 行测试。负载测试和压力测试都属于性能测试&#xff0c;二者可结合使用。 性能指标主要有平均响应时间、90%响应时间、吞吐量、吞吐率&#xff0c;每秒事务数&am…

新版Spring Security6.2架构 (三) - Authorization

前言 书接上文&#xff0c;在经过了authentication后就是authorization了&#xff0c;本文还是对官网文档authorization的一个架构翻译和个人理解&#xff0c;后续的博客在写具体使用例子&#xff0c;从数据中认证&#xff0c;融合authentication和authorization的概念。 Aut…

【论文解读】Accelerating motion estimation by genetic algorithm approach in x265

时间&#xff1a;2018 级别&#xff1a;SCI 机构&#xff1a;College of Engineering Pune 摘要&#xff1a; 在过去 20 年&#xff0c;在视频编码和压缩领域&#xff0c;研究人员提出了几种减少运动估计的计算量和时间的技术&#xff0c;本文提出了一种基于遗传算法初始种群确…

电脑ffmpeg.dll丢失如何修复?3个详细修复的教程分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“ffmpeg.dll丢失”。ffmpeg.dll是FFmpeg多媒体框架中的一个重要组件&#xff0c;它负责处理音频和视频的编解码。当这个文件丢失或损坏时&#xff0c;可能会导致一些应用程序无法正常运行。…

2023年【G2电站锅炉司炉】报名考试及G2电站锅炉司炉考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉报名考试根据新G2电站锅炉司炉考试大纲要求&#xff0c;安全生产模拟考试一点通将G2电站锅炉司炉模拟考试试题进行汇编&#xff0c;组成一套G2电站锅炉司炉全真模拟考试试题&#xff0c;学员可通过G2电…

如何有效利用餐厅预约小程序推广餐厅品牌

随着餐饮行业竞争的加剧&#xff0c;餐厅订座预约成为了吸引顾客的一种重要方式。而微信小程序作为移动互联网的重要入口之一&#xff0c;为餐厅提供了一个方便快捷的预约平台。本文将介绍如何使用乔拓云平台等第三方小程序制作平台来开发餐厅订座预约微信小程序。 首先&#x…

进程、容器与虚拟机的区别

进程、容器与虚拟机 参考&#xff1a;关于进程、容器与虚拟机的区别&#xff0c;你想知道的都在这&#xff01; 进程、容器与虚拟机的结构图 进程 介绍 进程是一个正在运行的程序&#xff0c;它是一个个可执行文件的实例。当一个可执行文件从硬盘加载到内存中的时候&#xf…

【FreeRTOS】FreeRTOS移植stm32详细步骤介绍

我在查找FreeRTOS移植的相关教程特别少&#xff0c;所以想非常详细的介绍FreeRTOS移植stm32详细步骤&#xff0c;包括源码的下载&#xff0c;源码介绍&#xff0c;系统移植&#xff0c;代码验证等&#xff0c;每一步都有对应的介绍和解释&#xff0c;希望可以帮助到你们。 文章…

1. mycat入门

1、mycat介绍 Mycat 是一个开源的分布式数据库系统&#xff0c;但是由于真正的数据库需要存储引擎&#xff0c;而 Mycat 并没有存 储引擎&#xff0c;所以并不是完全意义的分布式数据库系统。MyCat是目前最流行的基于Java语言编写的数据库中间件&#xff0c;也可以理解为是数据…

Firmware Analysis Plus (Fap)固件模拟安装教程(最新)

最近在搞IoT的研究&#xff0c;但是难在设备比较难弄&#xff0c;只有固件&#xff0c;而没有设备&#xff0c;买吧&#xff0c;又太费钱&#xff0c;不划算。好在有很多项目可以在模拟环境中运行固件。但是几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同。 …

C++初学教程四

一、程序设计 程序设计的三种基本结构:顺序、选择、循环 选择结构(也叫分支结构) :判断所指定的条件是否满足&#xff0c;决定从给定的两组或多组操作选择其中的一种。 计算机的判断是通过对表达式的计算来实现&#xff0c;也就是关系运算、逻辑运算。 用语句来体现就是if语…

53 代码审计-TP5框架及无框架变量覆盖反序列化

目录 演示案例:Metinfo-无框架-变量覆盖-自动审计或搜索phpmyadmin-无框架-反序列化-自动审计或搜索Thinkphp5-有框架-搭建使用入口访问调试SQL等 演示案例: Metinfo-无框架-变量覆盖-自动审计或搜索 变量覆盖会直接覆盖原始变量&#xff0c;来形成新的变量值 搜索关键字或者…