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

2023-11-16

(一)传送门: 

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[刷题记录]牛客面试笔刷TOP101(二) 的相关文章

随机推荐

  • 如何搭建自己的写作素材库,快来学,方法高效简单

    我们平时看过的书 做过的事 不及时记下来 很可能过几天就忘记了 由此看来 搭建自己的写作素材库非常有必要 尤其是写作者 写稿的速度取决于自己写作素材的储备量 你储备的素材越多 写作时便可以拿来即用 不用再费尽心思找个好几天 我们该如何搭建自
  • ACL的规则总结

    按照由上到下的顺序执行 找到第一个匹配后既执行相应的操作 然后跳出ACL 每条ACL的末尾隐含一条deny any 的规则 ACL可应用于某个具体的IP接口的出方向或入方向 ACL可应用于系统的某种特定的服务 如针对设备的TELNET 在引
  • WEB开发中遇到的困难,controller方法对应的url显示不出来页面

    问题 controller方法对应的url返回页面但是显示不出来页面 等待下午来人求救 这个问题真是日了狗了啊 明明项目没动 刚开始运行项目的时候总是报错 java lang ClassNotFoundException 然后检查了一下对应
  • linux vi的命令

    inux vi命令详解 刚开始学着用linux 对vi命令不是很熟 在网上转接了一篇 vi编辑器是所有Unix及Linux系统下标准的编辑器 它的强大不逊色于任何最新的文本编辑器 这里只是简单地介绍一下它的用法和一小部分指 令 由于 对Un
  • 【录制Selenium IDE导出python代码】

    Generated by Selenium IDE import pytest import time import json from selenium import webdriver from selenium webdriver c
  • PHP内置函数intval()使用不当的安全漏洞分析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 描述 intval函数有个特性 直到遇上数字或正负符号才开始做转换 再遇到非数字或字符串结束时 结束转换 在某些应用程序里由于对intval函数这个特性认识不够 错误的
  • react中使用splice函数去删除数组的某一项

    1 splice函数 splice 方法向 从数组中添加 删除项目 然后返回被删除的项目 slice 方法可从已有的数组中返回选定的元素 所以 在使用的时候 就要注意的是 splice返回的是被删除的项目 2 举一个我在react中使用的小
  • 单片机预备知识(电平、进制转换、字节、数据类型)

    参考 郭天祥十天带你精通51单片机 网址 https www bilibili com video BV1DW411a7mz spm id from 333 788 videocard 0 目录 电平特性 二进制 进制转换 1K字节等于多少
  • Ubuntu18.04 安装cmake-3.18.0,报错openssl

    1 问题描述 Downloads wget https cmake org files v3 18 cmake 3 18 0 tar gz Downloads tar xf cmake 3 18 0 tar gz Downloads cd
  • mvvm框架是什么

    MVVM是Model View ViewModel的简写 它本质上就是MVC Model View Controller 的改进版 在开发过程中 由于需求的变更或添加 项目的复杂度越来越高 代码量越来越大 此时我们会发现MVC维护起来有些吃
  • mysql表操作-约束删除、用户填加、授权和撤权

    目录 一 表的约束删除 1 查看所有表的约束条件 2 删除主键 3 删除唯一键 4 删除check键值 5 删除check键值 6 删除not null键值并删除check键值 7 删除键外值 8 检查表的约束条件是否存在 二 设置数据库密
  • 数据通信介绍

    数据通信方式有两种 串行通信与并行通信 一 串行通信 串行通信是指数据的各位在同一根数据线上逐位发送和接收 如下图所示 它可以按照数据传送方向和通信方式来划分 如果按照数据传送方向分类 则分为以下方式 单工 数据传输只支持数据在一个方向上传
  • 链接库的时候,提示load shared libraries error,xxx file too short

    该问题主要是提示 load shared libraries error xxx file too short 软连接链接问题 原因 程序链接的动态库中有软连接 但是软连接没有 l 标识 被识别成了实际的动态库文件 软连接文件又太小 所以就
  • 使用 vue-router 切换页面时怎么设置过渡动画

    如何实现切换页面时的过渡动画 背景 今天在编写页面时 看到页面没有任何效果就只是直入直出 完全没有一点逼格 所以想要实现类似于原生app的那种切换页面时的特效 遂开始google 发现网上各种方案都是各有优缺点 于是整理了自认为优雅的方案并
  • warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]

    warning gets is deprecated declared at usr include stdio h 638 Wdeprecated declarations 5 c In function getinfo 5 c 20 2
  • Mac Jenkins+fastlane 简单几步实现iOS自动化打包发布 + jenkins节点设置

    最近在使用jenkins 实现ios自动化打包发布蒲公英过程实践遇到了一些坑 特意记录下来方便有需要的人 进入正题 一 安装Jenkins 1 Mac上安装Jenkins 遇到到坑 因为 Jenkins 的pkg安装包默认安装位置为shar
  • 学习Python:探索无限可能

    Python是一种简洁而强大的编程语言 广泛应用于各个领域 从Web开发到数据分析 人工智能和科学计算 学习Python不仅可以提高编程技能 还能为你打开无限的创造力和发展机会 在本文中 我将介绍一些学习Python的重要用途 并提供相应的
  • 链家网页爬虫_爬虫实战1-----链家二手房信息爬取

    经过一段机器学习之后 发现实在是太枯燥了 为了增添一些趣味性以及熟练爬虫 在之后会不定时的爬取一些网站 旨在熟悉网页结构 尤其是HTML的元素 ajax存储 json 熟练使用pyspider scrapy两大框架 掌握基本的request
  • Java-向下转型-instanceof 关键词

    Java 向下转型 instanceof 关键词 1 父类对象转型为子类 package com lmwei p10 public class PersonTest public static void main String args 多
  • [刷题记录]牛客面试笔刷TOP101(二)

    一 传送门 刷题记录 牛客面试笔刷TOP101 一 HY PIGIE的博客 CSDN博客 目录 1 合并二叉树 2 二叉树的镜像 3 判断是否为二叉搜索树 4 判断是不是完全二叉树 1 合并二叉树 合并二叉树 牛客题霸 牛客网 nowcod