网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
初阶面试题
二叉树的最大深度
题:二叉树的最大深度
解题思路:该题可以使用最为简单的递归方法进行实现,如当根结点为空时返回0,如果不是则继续将其左孩子和右孩子进行递归;
递归如图:
代码如下:
class Solution {
public int maxDepth(TreeNode root) {
if(root==null){
//如果该结点为空则返回0
return 0;
}
int leftDepth=maxDepth(root.left);//递归该结点的左孩子
int rightDepth=maxDepth(root.right);//递归该结点的右孩子
if(leftDepth>rightDepth){//比较左右的深度,谁大就返回其深度+1;
return leftDepth+1;
}
return rightDepth+1;
}
}
其时间复杂度为O(n):其中n是二叉树的结点数并且每一个结点都会被遍历一次,空间复杂度为O(high):其中high是二叉树的高度,因为每使用一次递归需要开辟一个栈空间,而栈的开辟空间取决于递归的深度。
平衡二叉树
平衡二叉树
解题思路:由题可知,平衡二叉树指二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。那么我们可以使用递归的方法先求出该节点左子树的深度和右子树的深度,再看其绝对值之差是否小于等于1。
代码如下:
class Solution {
public int maxDepth(TreeNode root){
if(root==null){
return 0;
}
int left=maxDepth(root.left);
int right=maxDepth(root.right);
return Math.max(left,right)+1;
}
public boolean isBalanced(TreeNode root) {
if (root==null){
return true;
}
int left=maxDepth(root.left);
int right=maxDepth(root.right);
if (Math.abs(left-right)<=1&&isBalanced(root.right)&&isBalanced(root.left)){
return true;
}
return false;
}
其时间复杂度为O(n*n):n为二叉树的结点个数。
空间复杂度为O(n):n 是二叉树中的节点个数。空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过 n。
为了提高时间复杂度效率,可以使用自底向上的递归方法:该方法是先递归判断左右子树是否平衡,最后判断该结点是否为平衡树,如果为则返回高度否则则返回-1
代码如下
class Solution {
public int maxDepth(TreeNode root){
if(root==null){
return 0;
}
int left=maxDepth(root.left);
int right=maxDepth(root.right);
if(left>=0&&right>=0&&Math.abs(left-right)<=1){
return Math.max(left,right)+1;
}
return -1;
}
public boolean isBalanced(TreeNode root){
return maxDepth(root)>=0;
}
}
优化后时间复杂度为O(n)
相同的树
相同的树
解题思路:该题使用递归方法可以简单解决,首先我们应该判断该节点是否为空 1.如果p,q都为空则返回true 2.如果p,q只有一个树为空则返回false. 如果p的值不等于q的值则返回false。
核心代码如下:
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p==null&&q==null){//如果p,q都为空则返回true
return true;
}
if(p==null||q==null){//如果p,q只有一个树为空则返回false
return false;
}
if(p.val!=q.val){//p,q的值不相等
return false;
}
if(isSameTree(p.left,q.left)&&isSameTree(p.right,q.right)){
//递归
return true;
}
return false;
}
}
另一棵树的子树
另一棵树的子树
解题思路:其解题方法与上面的题:相同的树大体一样,不过该题得先判断subRoot的根结点是否为root 的根结点还是为root的左孩子或者为root的右孩子。
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p==null&&q!=null||p!=null&&q==null){
return false;
}
if(p==null&&q==null){
return true;
}
if(p.val!=q.val){
return false;
}
if(isSameTree(p.left,q.left)&&isSameTree(p.right,q.right))
{
return true;
}
return false;
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root==null){//判断root是否为空
return false;
}
if(isSameTree(root,subRoot)){
//判断subRoot的根结点是否为root 的根结点
return true;
}
if (isSubtree(root.left,subRoot)){
//subRoot的根结点是否为root 的左孩子
return true;
}
if(isSubtree(root.right,subRoot)){
//subRoot的根结点是否为root 的右孩子
return true;
}
return false;}
}
对称二叉树
对称二叉树
解题思路:先判断该树是否为空,再利用递归方法判断左孩子和右孩子的值是否相等。
代码如下:
class Solution {
public boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree){
if(leftTree==null&&rightTree!=null||leftTree!=null&&rightTree==null){
return false;
}
if(leftTree==null&&rightTree==null){
return true;
}
if (leftTree.val!=rightTree.val){
return false;
}
return isSymmetricChild(leftTree.left,rightTree.right)&&isSymmetricChild(leftTree.right,rightTree.left);
}
public boolean isSymmetric(TreeNode root) {
if (root==null){
return false;
}
return isSymmetricChild(root.left,root.right);
}
}
二叉树的镜像
二叉树的镜像
解题思路:
代码如下:使用递归方法,先判断该树是否为空,再使用递归方法交换左右子树最后返回根节点。
public class Solution {
/\*\*
\* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
\*
\*
\* @param pRoot TreeNode类
\* @return TreeNode类
\*/
public TreeNode Mirror (TreeNode pRoot) {
// write code here
if(pRoot==null){
return null;
}
TreeNode root=new TreeNode(pRoot.val);
root.left=Mirror(pRoot.right);
root.right=Mirror(pRoot.left);
return root;
}
}
进阶面试题
把二叉树打印成多行
把二叉树打印成多行
解题思路:由题可知,其根本是让我们进行二叉树的层次遍历,则我们需要使用队列为了打印出多行则需要将遍历后的值放入集合中
代码如下:
import java.util.\*;
![img](https://img-blog.csdnimg.cn/img_convert/2bcfcd44d7cccc2ce5d802163701e763.png)
![img](https://img-blog.csdnimg.cn/img_convert/8c8485d5b1b991c9830a348cd18760f1.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
-1715536674172)]
[外链图片转存中...(img-lBbA9Ark-1715536674172)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**