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

news2024/11/25 19:28:08

(一)传送门: 

[刷题记录]牛客面试笔刷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;
    }

6.二叉搜索树的最近公共祖先

二叉搜索树的最近公共祖先_牛客题霸_牛客网 (nowcoder.com)

思路:

先遍历找到两个目标节点,并使用列表来记录所遍历的节点.

因为是二叉搜索树,所以遍历的思路与二维数组查找的思路很相似,当前节点的val小于目标节点时走向右节点,反之向左节点.直至找到目标节点.

再一起遍历两个路径列表,在列表中的最后一个相同的节点就是最近的公共祖先.

 

public List<Integer> path(TreeNode root,int val){
        List<Integer> ret = new ArrayList<>();
        while(root != null){
            ret.add(root.val);

            if(root.val == val){
                break;
            }
            if(root.val < val){
                root = root.right;
            }else{
                root = root.left;
            }
        }
        return ret;
    } 
    public int lowestCommonAncestor (TreeNode root, int p, int q) {
        // write code here
        //前提是二叉搜索树
        //首先得找到两个特定的节点
        //并使用列表来记录路径
        //当当前节点比目标节点大时,走左节点.反之走右节点
        List<Integer> path1 = path(root,p);
        List<Integer> path2 = path(root,q);
        //一起遍历两个列表
        int len1 = path1.size();
        int len2 = path2.size();
        int ret = 0;
        for(int i = 0 ; i < len1 && i < len2; i++){
            int tmp1 = path1.get(i);
            int tmp2 = path2.get(i);
            if(tmp1 == tmp2){
                ret = tmp1;
            }else{
                break;
            }
        }
        return ret;
    }

7.在二叉树中找到两个节点的最近公共祖先 

在二叉树中找到两个节点的最近公共祖先_牛客题霸_牛客网 (nowcoder.com)

思路:

使用递归先来找到特定的节点.

如果两个目标节点在同一颗小树下,则直接返回根节点.

如果当前小树只有左节点或右节点为目标节点则返回当前的目标节点. 

public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
        // write code here
        if(root == null){
            return -1;
        }
        if(root.val == o1 || root.val == o2){
            return root.val;
        }
        int left = lowestCommonAncestor(root.left,o1,o2);
        int right = lowestCommonAncestor(root.right,o1,o2);
        if(left == -1){
            return right;
        }
        if(right == -1){
            return left;
        }
        return root.val;
    }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络协议】Http-中

搜索引擎&#xff1a;搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息&#xff0c;在对信息进行组织和处理后&#xff0c;为用户提供检索服务&#xff0c;将检索的相关信息展示给用户的系统。搜索引擎是工作于互联网上的一门检索技术&#xff0c;它旨在提…

WPF 类库 使用handycontrol 配置

在学习wpf发现了一个非常好用的UI库 handycontrol 但是很多地方讲的都是WPF应用程序怎么用&#xff0c;很少有讲类库那么引用的问题&#xff0c;所以在这里自己总结一下&#xff0c;希望能帮助到大家&#xff1a; 1.添加 handycontrol 的引用&#xff1b;安装&#xff0c;我已…

Webpack打包图片

一、在js文件中引入图片 二、在package.config.js中配置加载器 module.exports {mode: "production", // 设置打包的模式&#xff1a;production生产模式 development开发模式module: {rules: [// 配置img加载器{test: /\.(jpg|png|gif)$/i,type:"asset/resou…

计算机竞赛 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(六)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 模型训练1&#xff09;数据集分析2&#xff09;数据预处理3&#xff09;模型创建4&#xff09;模型训练5&#xff09;获取特征矩阵 2. 后端Django3. 前端微信小程序1&#xff09;小程序全局配置文件2&#xff09…

【广州华锐互动】煤矿坍塌VR事故警示教育突破了哪些限制?

煤矿坍塌事故是煤矿行业的一种常见事故&#xff0c;对于矿工的生命安全和生产设备都存在着严重威胁。传统的安全培训方式往往难以真实地呈现事故场景&#xff0c;难以达到理想的安全教育效果。而虚拟现实&#xff08;VR&#xff09;技术的出现&#xff0c;为煤矿安全教育带来了…

测试人职场生存必须避开的5个陷阱

在互联网职场的工作发展道路上&#xff0c;软件测试人员其实在公司中也面临着各种各样的职场陷阱&#xff0c;有些可能是因为项目业务不熟练造成的&#xff0c;有些可能是自身技术能力不足导致的...等等。软件测试入门相对来说比较容易些&#xff0c;但是想要在测试行业长久发展…

力扣刷题-数组-数组理论基础

数组是存放在连续内存空间上的相同类型数据的集合。 需要两点注意的是 数组下标都是从0开始的。数组内存空间的地址是连续的 正是因为数组的在内存空间的地址是连续的**&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;就难免要移动其他元素的地址。** 注意&…

S型加减速行车位置控制(支持点动和停靠位置搜索)

S型加减速位置控制详细算法和应用场景介绍&#xff0c;请查看下面文章博客。本篇文章不再赘述&#xff0c;这里主要介绍点动动和位置点搜索功能。 S速度曲线轨迹规划(普通变频位置闭环控制算法详细介绍SCL代码)_s曲线轨迹规划_RXXW_Dor的博客-CSDN博客位置控制用PD控制器&…

Rsync学习笔记2

Rsync&#xff1a; 增量操作&#xff1a; 1&#xff09; server01服务文件变动。 [rootserver03 tp5shop]# rsync -av /usr/local/nginx/html/tp5shop root192.168.17.109:/usr/local/nginx/html/ sending incremental file listsent 88,134 bytes received 496 bytes 177,…

KMP,ACM集训

目录 831. KMP字符串 输入格式 输出格式 数据范围 输入样例&#xff1a; 输出样例&#xff1a; 解析&#xff1a;KMP模板 D - Cyclic Nacklace 解析&#xff1a;KMP-next数组应用循环字符串判断 F - Power Strings 解析&#xff1a;KMP-next数组应用循环字符串判断 H - …

Haproxy负载均衡群集

HAproxy搭建Web群集一、Web集群调度器1、常见的Web集群调度器2、常用集群调度器的优缺点&#xff08;LVS ,Nginx,Haproxy)2.1 Nginx2.2 LVS2.3 Haproxy 3、LVS、Nginx、HAproxy的区别 二、Haproxy1、简介2、Haproxy应用分析3、HAProxy的主要特性4、Haproxy调度算法&#xff08;…

智慧云图书馆: 能支撑智慧图书馆服务体系的图书馆管理与服务平台

一、开源项目简介 柏拉图 PLATO 智慧云图书馆&#xff1a; 能支撑智慧图书馆服务体系的图书馆管理与服务平台。 二、开源协议 未使用主流开源协议 三、界面展示 四、功能概述 平台优势 总分馆架构&#xff1a;不再是信息的孤岛&#xff0c;而是共享信息的平台。友好的界…

openGauss学习笔记-76 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT简介

文章目录 openGauss学习笔记-76 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT简介76 MOT简介 openGauss学习笔记-76 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT简介 本节介绍了openGauss内存优化表&#xff08;Memory-Optimized Table&#xff0c;MOT…

spring-boot---validation,参数校验,分组,嵌套,各种类型

写在前面&#xff1a; 参数校验基本上是controller必做的事情&#xff0c;毕竟前端传过来的一切都不可信。 但是每次if(StrUtil.isNotNull())啥的有时候多还难写。validation可以简化这一操作。 文章目录 项目构建问题展示validation使用快速入门注释 Valid与Validated区别使…

【面试必刷TOP101】判断一个链表是否为回文结构 链表的奇偶重排

目录 题目&#xff1a;判断一个链表是否为回文结构_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com) 题目的…

Twitter图片数据优化的细节

Twitter个人数据优化&#xff1a;吸引更多关注和互动 头像照片在Twitter上&#xff0c;头像照片是最快识别一个账号的方法之一。因此&#xff0c;请务必使用公司的标志或与品牌相关的图片。建议尺寸为400x400像素。 为了建立强大的品牌形象和一致性&#xff0c;强烈建议在所有…

WebGL 初始化着色器

目录 前言 初始化着色器的7个步骤 创建着色器对象&#xff08;gl.createShader&#xff08;&#xff09;&#xff09; gl.createShader&#xff08;&#xff09;规范 gl.deleteShader&#xff08;&#xff09;规范 指定着色器对象的代码&#xff08;gl.shaderSource&…

大二层—多链接透明互联协议如何工作

大二层就引入了 TRILL&#xff08;Transparent Interconnection of Lots of Link&#xff09;&#xff0c;即多链接透明互联协议。它的基本思想是&#xff0c;二层环有问题&#xff0c;三层环没有问题&#xff0c;那就把三层的路由能力模拟在二层实现。 运行 TRILL 协议的交换…

23062QTday5

完成登录界面的注册功能 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QApplication> #include <iostream> #include <QMessageBox> #include <QtDebug> #include <QIcon> #include<QPushButton> #incl…