面试必问的几大问题,数据结构java版之二叉树,内含福利

}

5.获取二叉树的高度

思路分析:

代码如下:

// 获取二叉树的高度(时间复杂度为O(n))

int getHeight(BTNode root){
    if(root==null){
        return 0;
    }
   int leftHeight=getHeight(root.left);
    int rightHeight=getHeight(root.right);

//此处用的是三目运算符求取两者中的较大值

    return leftHeight>rightHeight?leftHeight+1:rightHeight+1;
}

6.检测值为value的元素是否存在

解题思路:

代码如下 :

// 检测值为value的元素是否存在

boolean find(BTNode root, int val) {
    if (root == null) {
        return false;
    } else if (root.val == val) {
        return true;
    }
    if (find(root.left, val) || find(root.right, val)) {
        return true;
    }
    return false;
}

7.判断一棵树是不是完全二叉树

解题思路:

代码如下:

boolean isCompleteTree(BTNode root){

    if(root == null) return true;
    Queue<BTNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        BTNode cur = queue.poll();
        if(cur != null) {
            queue.offer(cur.left);
            queue.offer(cur.right);
        }else {
            break;
        }
    }

//第二个while循环实质上就是在cur=null的基础上来判断实现的,若是整个为空即null 则true;反之为false

    while (!queue.isEmpty()) {
        BTNode top = queue.peek();
        if(top != null) {
            return false;
        }
        queue.poll();
    }
    return true;
}

1. 检查两颗树是否相同

100. 相同的树 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/same-tree/

解题思路:

要判断两棵树是否相同:

①数的结构相同

②相应位置的结点对应的数值相同

代码如下:

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;
    }
    //p != null && q!= null && p.val == q.val
    return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}

2. 另一颗树的子树

572. 另一棵树的子树 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/subtree-of-another-tree/

代码如下:

public boolean isSubtree(TreeNode root, TreeNode subRoot) {

if(root == null || subRoot == null) {

         return false;
     }
    //根节点和subroot是不是两颗相同的树
    if(isSameTree(root,subRoot)) {
        return true;
    }
    //subRoot是不是root的左子树
    if(isSubtree(root.left,subRoot)) {
        return true;
    }
    if(isSubtree(root.right,subRoot)) {
        return true;
    }
    return false;

}

}

3. 二叉树最大深度

104. 二叉树的最大深度 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

同二叉树基本操作的5题,请参考此篇博客上方

4. 判断一颗二叉树是否是平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/balanced-binary-tree/submissions/

解题思路:

class Solution {

public int height (TreeNode root) {

    if(root == null) {return 0;}
    int leftHeight = height(root.left);
    int rightHeight = height(root.right);
    return (leftHeight > rightHeight) ?
            (leftHeight+1) :(rightHeight+1);
}
/**
 时间复杂度:O(N^2)
 */
public boolean isBalanced(TreeNode root) {
    if(root == null) return true;
    int left = height(root.left);
    int right = height(root.right);
    return Math.abs(left-right) <= 1 && isBalanced(root.left) && isBalanced(root.right);
}

}

5. 对称二叉树

101. 对称二叉树 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/symmetric-tree/解题思路:

代码如下:

class Solution {

 public boolean isSymmetric(TreeNode root) {
    if(root == null) return true;
    return isSymmetricChild(root.left,root.right);
}

public boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree) {

   //第一种情况
   if(leftTree == null && rightTree == null) return true;
   //第二种情况
    if((leftTree == null && rightTree != null)||(leftTree != null && rightTree == null))               return false;
    //第三种情况
    if(leftTree.val != rightTree.val) return false;
    return isSymmetricChild(leftTree.left,rightTree.right) &&
            isSymmetricChild(leftTree.right,rightTree.left);
}

6. 二叉树的构建及遍历牛客网链接icon-default.png?t=M0H8http:///www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking

7. 二叉树的分层遍历

102. 二叉树的层序遍历 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

解题思路:

借助一个队列和一个临时变量cur来打印分层遍历

①讨论根是否为空的情况

②当队列不为空时,出队列中的队尾元素到cur中,并通过cur.val进行打印

③循环讨论子左右子树的情况,所以要用while进行循环

两类代码:

①普通代码:

//打印层序遍历二叉树

public void levelOrder(TreeNode root) {

    Queue<TreeNode> queue = new LinkedList<>();

//①判断树是否为空的情况

    if(root == null) return;
    queue.offer(root);

//②判断队列是否为空

    while (!queue.isEmpty()) {
        TreeNode cur = queue.poll();
        System.out.print(cur.val+" ");
        if(cur.left != null) {
            queue.offer(cur.left);
        }
        if(cur.right != null) {
            queue.offer(cur.right);
        }
    }
}

②OJ上解题的代码:

解题思路:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

面试了阿里,滴滴,网易,蚂蚁,最终有幸去了网易【面试题分享】

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

[外链图片转存中…(img-5l7HAhIh-1712353847426)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值