【Java数据结构】 二叉树经典OJ面试题——刷题笔记+解题思路_java 树结构对应的经典面试题(1)

最后如何让自己一步步成为技术专家

说句实话,如果一个打工人不想提升自己,那便没有工作的意义,毕竟大家也没有到养老的年龄。

当你的技术在一步步贴近阿里p7水平的时候,毫无疑问你的薪资肯定会涨,同时你能学到更多更深的技术,交结到更厉害的大牛。

推荐一份Java架构之路必备的学习笔记,内容相当全面!!!

成年人的世界没有容易二字,前段时间刷抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。

你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?做了这么多年还不如一个应届生,真的非常尴尬!

进了这个行业就不要把没时间学习当借口,这个行业就是要不断学习,不然就只能被裁员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!

【关注】+【转发】+【点赞】支持我!创作不易!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

}


## 后续遍历


**题目:**![在这里插入图片描述](https://img-blog.csdnimg.cn/22656ad9ad7f4763b44c0cb0c12dc11b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_16,color_FFFFFF,t_70,g_se,x_16)


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


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


**实现代码:**



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


## 判断两棵树是否是相同树


**题目:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/57721d629afa4e6c85a7a997482e1ff1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_20,color_FFFFFF,t_70,g_se,x_16)  
 **思路:**


1. 首先要明确两棵树相同,指的是**左子树和右子树都相同,且值也相同**
2. 先判断,两棵树的`根节点是否为空`,如果两棵树的根节点都是空,那这两棵树相同,直接返回true;
3. 如果两棵树`只有一棵树的根节点为空`,另一棵树的根节点不为空,那这两棵树必不相同,直接返回false
4. 如果两棵树的`根节点都不为空,那就比较其值`,如果值不一样,两棵树就不相同,返回false
5. 当以上条件都没返回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);
}
}


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


**题目:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b2af5f86b87943f4bc82bb218e19da2b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_18,color_FFFFFF,t_70,g_se,x_16)


**思路:**


1. 这题需要自己额外写一个`判断是否是相同树的方法`(**参考上一题,实现代码一模一样**)
2. 如果当前树的根节点是空,则另一棵树肯定不是它的子树
3. 如果另一棵树的根节点是空,则肯定是当前树的子树
4. 每往下递归一个节点,就要判断一次,当前根节点代表的树是否和另一棵树是相同树  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/764b58bcf3664b1d87adb78b77659bc8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_18,color_FFFFFF,t_70,g_se,x_16)


**实现代码:**



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

}


## 求二叉树最大深度


**题目:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/71a018ced00a401aa2dbbfc3584f4354.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_18,color_FFFFFF,t_70,g_se,x_16)


**思路:**


1. 先搞懂一个问题,就是二叉树的深度 = 左子树深度和右子树深度**两者取较大值**
2. 所以有一个公式,`最大深度=左子树深度>右子树深度?左子树深度:右子树深度`
3. 利用公式,可以进行**递归**
4. 先判断当前根节点是否空,空的话返回0(即深度为0)
5. 然后依次判断左子树和右子树的深度
6. **注意:**`返回的时候要+1,因为根节点也算一层`  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/218d1db729bf496c98b680aa9deaefca.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_11,color_FFFFFF,t_70,g_se,x_16)


**实现代码:**



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;//递归公式
}
}


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


**题目:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0e53a43ccd7b4e01a4b9d9d77ed133d0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_17,color_FFFFFF,t_70,g_se,x_16)


**思路:**


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
}

}


## 判断镜像二叉树


**题目:**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d03cd729eab04ff79b33e65f0b10906a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_17,color_FFFFFF,t_70,g_se,x_16)


**思路:**


1. 这道题其实就是`判断左右子树是否相同`,只不过还需要做一点`小小的改动`
2. 因为要判断是不是镜像,所以改动就是 `左子树的左孩子值 要等于 右子树的右孩子值,左子树的右孩子值 要等于 右子树的左孩子值`  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1f4a75c4f7cb4c0ea989c22637dc982c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pWy5Luj56CB55qE5biD6I6x5oGp54m5,size_8,color_FFFFFF,t_70,g_se,x_16)




# 惊喜

最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

![image.png](https://img-blog.csdnimg.cn/img_convert/5362aaafa84c880a18f56ace1c3edd85.webp?x-oss-process=image/format,png)


![image.png](https://img-blog.csdnimg.cn/img_convert/06ecc99f5f8354488e5d80d4b15f614a.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**



[外链图片转存中...(img-Ov4xtvoR-1715478871829)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值