【Java数据结构】 二叉树经典OJ面试题——刷题笔记+解题思路

简介: 【Java数据结构】 二叉树经典OJ面试题——刷题笔记+解题思路

image.png

【Java数据结构】 二叉树经典OJ面试题——刷题笔记+解题思路

二叉树的前序遍历

中序遍历

后续遍历

判断两棵树是否是相同树

另一棵树是否是当前树的子树

求二叉树最大深度

判断二叉树是否是平衡二叉树

判断镜像二叉树

二叉树的前序遍历

前中后序 遍历 其实方法都一样,就是把节点的访问顺序变一下,代码都一模一样,只是换顺序罢了


题目:

image.png

思路: 本题要求将遍历到的节点放入一个List中返回

  1. 前序遍历顺序:根节点——>左孩子节点——>右孩子节点
  2. 先判断根节点,如果根节点为空,直接返回list
  3. 将当前访问的根节点存入顺序表中
  4. 然后递归访问左孩子节点
  5. 最后递归访问右孩子节点

实现代码:

image.png

中序遍历

题目:

image.png

思路: 本题要求将遍历到的节点放入一个List中返回

  1. 中序遍历顺序:左孩子节点——>根节点——>右孩子节点
  2. 先判断当前根节点,如果根节点为空,直接返回list
  3. 访问左孩子节点
  4. 将当前访问的根节点值存入顺序表
  5. 最后访问右孩子节点

实现代码:

image.png

后续遍历

image.png

思路: 本题要求将遍历到的节点放入一个List中返回

  1. 后序遍历顺序:左孩子节点——>右孩子节点——>根节点
  2. 先判断当前根节点,如果根节点为空,直接返回list
  3. 访问左孩子节点
  4. 访问右孩子节点
  5. 最后将当前访问的根节点值存入顺序表

实现代码:

image.png

判断两棵树是否是相同树

题目:

image.png

思路:


首先要明确两棵树相同,指的是左子树和右子树都相同,且值也相同

先判断,两棵树的根节点是否为空,如果两棵树的根节点都是空,那这两棵树相同,直接返回true;

如果两棵树只有一棵树的根节点为空,另一棵树的根节点不为空,那这两棵树必不相同,直接返回false

如果两棵树的根节点都不为空,那就比较其值,如果值不一样,两棵树就不相同,返回false

当以上条件都没返回false,也就是说两棵树的根节点都相同,那么就用 递归 去判断他们的左右孩子节点是否相同,进行套娃,即可

实现代码:

image.png

另一棵树是否是当前树的子树

题目:

image.png

思路:

  1. 这题需要自己额外写一个判断是否是相同树的方法参考上一题,实现代码一模一样
  2. 如果当前树的根节点是空,则另一棵树肯定不是它的子树
  3. 如果另一棵树的根节点是空,则肯定是当前树的子树
  4. 每往下递归一个节点,就要判断一次,当前根节点代表的树是否和另一棵树是相同树

image.png

实现代码:

class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if (subRoot == null) return true; //另一棵树的根节点是空,则肯定是当前树的子树
        if (root == null) return false; //当前树的根节点是空,则另一棵树肯定不是它的子树
        return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot)||isSameTree(root,subRoot);//没往下走一个节点,都要判断一次当前根节点代表的树是否和另一棵树是相同树
    }
     public boolean isSameTree(TreeNode s, TreeNode t) {
        if (s == null && t == null) return true;//都为空
        if (s == null || t == null) return false;//有一个不为空
        if(s.val!=t.val) return false;//值不同,返回false
        //值都相同,继续下一个节点的判断
        return isSameTree(s.left, t.left) && isSameTree(s.right, t.right);
    }
}

求二叉树最大深度

题目:

image.png

思路:


先搞懂一个问题,就是二叉树的深度 = 左子树深度和右子树深度两者取较大值

所以有一个公式,最大深度=左子树深度>右子树深度?左子树深度:右子树深度

利用公式,可以进行递归

先判断当前根节点是否空,空的话返回0(即深度为0)

然后依次判断左子树和右子树的深度

注意:返回的时候要+1,因为根节点也算一层

image.png

实现代码:

image.png

判断二叉树是否是平衡二叉树

题目:

image.png

思路:

  1. 本题中,一棵高度平衡二叉树定义为:
    一个二叉树每个节点左右两个子树的高度差绝对值不超过 1
  2. 采取从下往上看的思路,额外写一个判断树高度的方法
  3. 判断当前根节点的左子树高度和右子树高度之差的绝对值是否不超过1
  4. 符合平衡条件则返回子树高度,否则返回

实现代码:


image.png

判断镜像二叉树

题目:

image.png

思路:

  1. 这道题其实就是判断左右子树是否相同,只不过还需要做一点小小的改动
  2. 因为要判断是不是镜像,所以改动就是 左子树的左孩子值 要等于 右子树的右孩子值,左子树的右孩子值 要等于 右子树的左孩子值

image.png

实现代码:

image.png




相关文章
|
4天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
4天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
32 8
|
1天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
19 4
|
25天前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
72 1
Java面试题之Java集合面试题 50道(带答案)
|
14天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
33 5
|
13天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
15 1
|
22天前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
22 3
|
25天前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
68 0
Java面试题之cpu占用率100%,进行定位和解决
|
27天前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
16 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
27天前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
17 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树