[刷题记录]牛客面试笔刷TOP101(二)

2023-09-18 17:43:41

(一)传送门: 

[刷题记录]牛客面试笔刷TOP101(一)_HY_PIGIE的博客-CSDN博客

目录

1.合并二叉树  

2.二叉树的镜像

 3.判断是否为二叉搜索树

 4.判断是不是完全二叉树


1.合并二叉树  

合并二叉树_牛客题霸_牛客网 (nowcoder.com)

思路:

在后序遍历的基础上进行,两颗二叉树可能会有位置有空缺的情况.

在一个子树下,拿到了左节点与右节点并在根节点下进行操作->后序遍历

public TreeNode mergeTrees (TreeNode t1, TreeNode t2) {
        // write code here
        //如果是两个都是空的也无所谓,相互返回空就好了
        if(t1 == null){
            return t2;
        }
        if(t2 == null){
            return t1;
        }
        //创建一个合并的新节点作为根节点
        TreeNode root = new TreeNode(t1.val + t2.val);
        //进行后序遍历
        TreeNode left = mergeTrees(t1.left,t2.left);
        TreeNode right = mergeTrees(t1.right,t2.right);
        //拼装
        root.left = left;
        root.right = right;
        return root;
    }

2.二叉树的镜像

二叉树的镜像_牛客题霸_牛客网 (nowcoder.com)

思路:

分别交换每一颗子树的左右节点,采用后序遍历的方式

public TreeNode Mirror (TreeNode pRoot) {
        // write code here
        if(pRoot == null){
            return null;
        }
        //镜像就是交换每一颗子树的左右节点
        //那就要先拿到其左右节点
        //可以使用后序遍历的方式,后序遍历为:左右根
        //当来到根的时候,已经分别拿到了两个节点
        //再分别将他们交换位置即可
        TreeNode left = Mirror(pRoot.left);
        TreeNode right = Mirror(pRoot.right);
        pRoot.left = right;
        pRoot.right = left;
        return pRoot;
    }

 3.判断是否为二叉搜索树

判断是不是二叉搜索树_牛客题霸_牛客网 (nowcoder.com)

思路:

二叉搜索树:左节点<根<右节点. 

可以结合下面这一题一起看

二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)

二叉搜索树的中序遍历则是一个递增的序列,当判断一颗二叉树是否为二叉搜索树时只要判断其中序遍历得到的数值是否为递增就好了.

既然要比较,就要用到两个指针.

一个指针指向当前遍历的节点,还有一个指针记录上一个节点的数值.进行比较后移位.

错解:

忘记更新pre了....

 int pre = Integer.MIN_VALUE;
    public boolean isValidBST (TreeNode root) {
        // write code here
        if(root == null){
            return true;
        }
        //遍历左子树
        boolean left = isValidBST(root.left);
        //判断前驱的数值与当前节点的数值关系
        if(pre > root.val){
            return false;
        }
        
        boolean right = isValidBST(root.right);
        return left && right;
    }

 正解:

    int pre = Integer.MIN_VALUE;
    public boolean isValidBST (TreeNode root) {
        // write code here
        if(root == null){
            return true;
        }
        //遍历左子树
        boolean left = isValidBST(root.left);
        //判断前驱的数值与当前节点的数值关系
        if(pre > root.val){
            return false;
        }
        //更新一下pre
        pre = root.val;
        //遍历右子树
        boolean right = isValidBST(root.right);
        return left && right;
    }

 4.判断是不是完全二叉树

判断是不是完全二叉树_牛客题霸_牛客网 (nowcoder.com)

思路:

完全二叉树,不是满二叉树.

完全二叉树要求可以单独有左节点,但不能单独有右节点.

满二叉树是除了叶子节点,每一个节点都有左右节点.

使用层序遍历的方式,遍历二叉树放到队列中.

当遇到空节点时将其存放,并判断后面的节点是否为空,如果后面的节点不为空则判断其不是完全二叉树

 

public boolean isCompleteTree (TreeNode root) {
        // write code here
        //层序遍历
        //如果有左节点但没有右节点就返回false
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        boolean left = true;
        while(!queue.isEmpty()){
            //当队列不为空时
            TreeNode tmp = queue.poll();
            //当遇到空节点时
            if(tmp == null){
                left = false;
            }else{//如果当前节点不为空,判断前一个节点是否为空
                if(left == false){//如果前一个节点为空,且当前节点不为空
                    return false;//返回false;
                }
                //如果前一个节点与后一个节点都不为空
                //把其的左右节点加入
                queue.offer(tmp.left);
                queue.offer(tmp.right);
            }
        }
        return true;
    }

5.判断是不是平衡二叉树

判断是不是平衡二叉树_牛客题霸_牛客网 (nowcoder.com)

思路:

递归的思想,判断每一个根节点的左右子树的高度差.

public boolean IsBalanced_Solution (TreeNode pRoot) {
        // write code here
        //从上到下递归遍历
        //查看每一颗树的左右深度差
        if(pRoot == null){
            return true;
        }
        int left = deep(pRoot.left);
        int right = deep(pRoot.right);

        if(left - right > 1 || left - right < -1){
            return false;
        }

        return IsBalanced_Solution(pRoot.left) && IsBalanced_Solution(pRoot.right);
    }

    public int deep(TreeNode root){
        if(root == null){
            return 0;
        }
        int left = deep(root.left);
        int right = deep(root.right);
        return left < right ? right + 1 : left + 1;
    }

 

更多推荐

AI实战营第二期 第五节 《目标检测与MMDetection》——笔记6

文章目录摘要主要特性常用概念框、边界框交并比(loU)感受野有效感受野置信度目标检测的基本思路难点滑框在特征图进行密集计算边界框回归基于锚框VS无锚框NMS(非极大值抑制)使周密集预测模型进行推理步骤如何训练密集预测模型的训练匹配的基本思路密集检测的基本范式多尺度预测如何处理尺度问题基于锶框(Anchor)图像金字塔I

【需求侧响应】综合能源中多种需求响应——弹性电价、可平移及可削减研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码及数据💥1概述需求侧响应是一种通过调整能源消费行为以适应电网需

高比例清洁能源接入下计及需求响应的配电网重构(matlab代码)

1主要内容该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》,以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标,针对配电网重构模型的非凸性,引入中间变量并对其进行二阶锥松弛,构建混合整数凸规划模型,采用改进的IEEE33节点配电网进行算例仿真,分析了需求响应措施和清洁能源渗透率对配电网重构结果

基于yolov5的交通标志牌的目标检测研究——源码及文档

有需要本项目的全套代码和资源以及部署的可以私信博主!!!!!此外本项目所需的深度学习环境点击顶部即可下载,解压可以使用,直接跑所有的深度学习模型,超级方便!本课题研究,通过利用提供的公开数据集TT100K图标进行筛选和整理,最终得到TT100K数据中的45类交通标志牌数据。并将数据集进行分割,其中训练集:6664条;验

FFmpeg5.1.3编译动态库详细教程(基于Linux虚拟机)

FFmpeg编译详细教程FFmpeg编译详细教程本文原创:猿视野(一家分享技术架构思路,扩展程序员视野的网站,遇到技术问题,可以加联系方式相互交流)转载请注明出处和相关链接,否则追究其法律责任!原文地址:https://developer.aliyun.com/article/1326862?source=5176.1

【AI】机器学习——支持向量机(非线性及分析)

5.支持向量机(线性SVM)文章目录5.4非线性可分SVM5.4.1非线性可分问题处理思路核技巧核函数特点核函数作用于SVM5.4.2正定核函数由K(x,z)K(x,z)K(x,z)构造H\mathcal{H}H空间步骤常用核函数5.5SVM参数求解算法5.6SVM与线性模型关系5.4非线性可分SVM5.4.1非线性可

仿照Everything实现的文件搜索工具--SearchEverything

一、项目介绍项目名称:SearchEverything项目简介:SearchEverything是仿照Everything实现的一款桌面级的文件搜索软件,它是Everything的增强版,支持跨平台的使用。项目功能:1.选择文件夹后,多线程扫描文件夹下的子文件夹,显示文件的名称、路径、文件类型(文件夹还是文件)、文件大

面向高速公路车辆切入场景的自动驾驶测试用例生成方法

【摘要】为在自动驾驶汽车基于场景的测试中生成涵盖相应场景中复杂多变的真实交通运行过程的测试用例,从highD数据集中提取车辆切入场景的多个实际样本,通过分析运动参数和参与车辆之间的位置关系,建立车辆切入场景的描述模型,根据切入点的碰撞时间评估该方案的风险程度,并结合描述模型中参数的分布,采用蒙特卡罗方法生成测试用例。结

基于Java+vue前后端分离失物招领信息交互平台设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

初始化列表

目录必须在初始化列表初始化的条件:explicit多参数强制类型转换静态成员​编辑对于静态成员变量需要在构造函数里初始化吗?静态成员函数:题目1:求1+2+3+...+n_牛客题霸_牛客网(nowcoder.com)要求类对象只能在栈上:必须在初始化列表初始化的条件:1:const修饰的成员变量(只有一次初始化的机会,

VirtualBox安装RockyLinux并使用ssh访问

文章目录1前言2安装RockyLinux2.1新建虚拟机2.2设置虚拟机内存和CPU数量2.3设置虚拟机硬盘大小2.4完成设置2.5启动虚拟机2.6RockyLinux的安装2.6.1直接回车2.6.2等待check完成2.6.3设置语言2.6.4设置最小化安装2.6.5去除分区设置的感叹号2.6.7设置root账号的

热文推荐