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

简介: 笔记

二叉树的前序遍历


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

题目:

20.png

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

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

实现代码:

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        if(root==null){//根节点空
            return list;//直接返回顺序表
        }
        list.add(root.val);//将当前访问的根节点的值存入顺序表
        preorderTraversal(root.left);//访问左节点
        preorderTraversal(root.right);//访问右节点
        return list;
    }
}


中序遍历


题目:

21.png

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

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

实现代码:

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        if(root==null){//判断当前根节点是否为空
            return list;
        }
        inorderTraversal(root.left);//访问左孩子节点
        list.add(root.val);//将当前访问的根节点的值存入顺序表
        inorderTraversal(root.right);//访问右孩子节点
        return list;
    }
}

后续遍历

题目:22.png

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

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

实现代码:

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> postorderTraversal(TreeNode root) {
         if(root==null){//判断根节点是否为空
            return list;
        }
        postorderTraversal(root.left);//访问左孩子节点
        postorderTraversal(root.right);//访问右孩子节点
        list.add(root.val);//将当前访问的根节点的值存入顺序表
        return list;
    }
}


判断两棵树是否是相同树


题目:

23.png


思路:


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

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

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

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

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

实现代码:

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        //2个都为空
        if(p == null && q == null) {
            return true;
        }
        //只有一个不为空
        if(p == null || q == null) {
            return false;
        }
        //都不为空
        if(p.val != q.val) {
            return false;
        }
        //p和q不为空  且对应的值 是相同的  那么去判断两棵树的左树和右树
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
}


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


题目:

24.png

思路:

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

25.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);
    }
}


求二叉树最大深度


题目:

26.png

思路:


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

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

利用公式,可以进行递归

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

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

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

实现代码:

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null){//如果根节点空,返回0
            return 0;
        }
        int a=maxDepth(root.left);//求左子树高度
        int b=maxDepth(root.right);//求右子树高度
        return (a > b ? a : b )+ 1;//递归公式
    }
}


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


题目:

29.png思路:

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

实现代码:

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(height(root)>=0)
            return true;
        else 
            return false;
    }
    //从下往上看
    public int height(TreeNode root) {
        if (root == null) //根节点空,返回0
        return 0;
        int left = height(root.left);//获得左节点高度
        if(left == -1) 
        return -1;
        int right = height(root.right);//获得右节点高度
        if(right == -1) 
        return -1;
        return Math.abs(left - right) <=2 ? Math.max(left, right) + 1 : -1;
        //如果左子树和右子树高度差绝对值不大于1,返回子树的高度,否则返回-1
    }
}


判断镜像二叉树


题目:

30.png


思路:

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

31.png

实现代码:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null){
            return false;  
        }
        return isSame(root.left,root.right);//左右子树符合镜像条件,则是镜像二叉树
    }
    public boolean isSame(TreeNode a,TreeNode b){
        if(a == null && b ==null)
            return true;
        if(a == null || b ==null)
            return false;
        if(a.val != b.val)
            return false;
        //关键在于最后一行代码
        //左子树的左孩子值 要等于 右子树的右孩子值
        //左子树的右孩子值 要等于 右子树的左孩子值
        return isSame(a.left,b.right)&&isSame(a.right,b.left);
    }
}
相关文章
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
531 10
 算法系列之数据结构-二叉树
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
349 10
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
597 12
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
771 3
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
505 4
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
2098 9
|
10月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
441 1
|
10月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
411 1
|
11月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案