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

这篇具有很好参考价值的文章主要介绍了Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

 

文章目录

        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:

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

输入: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:

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

输入: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:

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

输入: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:

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

输入: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:

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

输入: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:

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

输入: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(")");
    }   
}

 

Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等),Java LeetCode篇,leetcode,算法,java,数据结构文章来源地址https://www.toymoban.com/news/detail-752840.html

到了这里,关于Java LeetCode篇-二叉树经典解法(实现:判断平衡二叉树、找两个节点最近的祖先等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode | 110. 平衡二叉树

    OJ链接 首先计算出二叉树的高度 然后计算当前节点的左右子树的高度,然后判断当前节点的左右子树高度差是否超过 1,最后递归地检查左右子树是否也是平衡的。

    2024年02月04日
    浏览(49)
  • leetcode 110. 平衡二叉树

            平衡二叉树 ,经典题目 。需要利用到之前求二叉树高度的思路。 先定义一个求高度的函数,然后使用递归的方式判断左子树和右子树的高度差是否小于等于1,下面上代码:                 挺经典的题,思路值得借鉴。

    2024年02月12日
    浏览(42)
  • 【leetcode热题】平衡二叉树

    难度: 简单 通过率: 39.9% 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树 每个节点  的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 

    2024年02月21日
    浏览(38)
  • ​LeetCode解法汇总823. 带因子的二叉树

    https://github.com/September26/java-algorithms 给出一个含有不重复整数元素的数组  arr  ,每个整数  arr[i]  均大于 1。 用这些整数来构建二叉树,每个整数可以使用任意次数。其中:每个非叶结点的值应等于它的两个子结点的值的乘积。 满足条件的二叉树一共有多少个?答案可能很

    2024年02月10日
    浏览(33)
  • 【深度优先】【广度优先】Leetcode 104 二叉树的最大深度 Leetcode 111 二叉树的最小深度 Leetcode 110 平衡二叉树

    二叉树节点的深度: 指从根节点到该节点的最长简单路径边的条数或者节点数 (取决于深度从0开始还是从1开始) 二叉树节点的高度: 指从该节点到叶子节点的最长简单路径边的条数后者节点数 (取决于高度从0开始还是从1开始) 【前序求的是深度,后序求的是高度】 -

    2024年02月19日
    浏览(52)
  • C语言经典算法之判断二叉树

    目录 前言 A.建议 B.简介 一 代码实现 二 时空复杂度 A.时间复杂度 B.空间复杂度 三 优缺点 A.优点: B.缺点: 四 现实中的应用 1.学习算法最重要的是理解算法的每一步,而不是记住算法。 2.建议读者学习算法的时候,自己手动一步一步地运行算法。 tips:文中的对数均以2为底

    2024年01月19日
    浏览(42)
  • ​LeetCode解法汇总2385. 感染二叉树需要的总时间

    https://github.com/September26/java-algorithms 给你一棵二叉树的根节点  root  ,二叉树中节点的值  互不相同  。另给你一个整数  start  。在第  0  分钟, 感染  将会从值为  start  的节点开始爆发。 每分钟,如果节点满足以下全部条件,就会被感染: 节点此前还没有感染。 节点

    2024年04月24日
    浏览(42)
  • Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

    题目链接:110. 平衡二叉树 - 力扣(LeetCode) 视频链接:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili 平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 本题就是求左右子树的高度差,如果差值=1,就是平衡

    2024年02月11日
    浏览(39)
  • 算法训练day17leetcode110平衡二叉树257二叉树的所有路径404左叶子之和

    https://www.bilibili.com/video/BV1GY4y1K7z8/?vd_source=8272bd48fee17396a4a1746c256ab0ae https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html#%E6%80%9D%E8%B7%AF 采用后序递归遍历,比较左右子树的高度,相差小于等于1 前序,中左右,从根节点到叶子节点,会一直向下遍历下去,不会返回信

    2024年01月19日
    浏览(43)
  • ​LeetCode解法汇总106. 从中序与后序遍历序列构造二叉树

    https://github.com/September26/java-algorithms 给定两个整数数组  inorder  和  postorder  ,其中  inorder  是二叉树的中序遍历,  postorder  是同一棵树的后序遍历,请你构造并返回这颗  二叉树  。 示例 1: 示例 2: 提示: 1 = inorder.length = 3000 postorder.length == inorder.length -3000 = inorder[i], pos

    2024年02月22日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包