【LeetCode-面试经典150题-day15】

目录

104.二叉树的最大深度

100.相同的树 

 226.翻转二叉树

 101.对称二叉树

 105.从前序与中序遍历序列构造二叉树

 106.从中序与后序遍历序列构造二叉树

 117.填充每个节点的下一个右侧节点指针Ⅱ


 

104.二叉树的最大深度

题意:

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

【输入样例】

root=[3,9,20,null,null,15,7]

【输出样例】

3

解题思路:递归

class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        //1是当树的根节点不为空时,加上根
        return 1 + Math.max(maxDepth(root.right),maxDepth(root.left));
    }
}

时间: 击败了100.00%

内存: 击败了36.81%

100.相同的树 

题意:

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

【输入样例】

p=[1,2,3], q=[1,2,3]

【输出样例】

true

解题思路:递归

1.先判断当前根节点的值是否一样

2.再判断是否都拥有左子树和右子树

3.递归判断左子树,右子树

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q == null){
            return true;
        }
        //如果说两者都会null,会在上面的分支语句返回true
        //这里判断的是只有一方为null的情况下
        if(p == null || q == null){
            return false;
        }
        //根都不为null,判断值是否相同
        if(p.val != q.val){
            return false;
        }
        return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
    }
}

时间: 击败了100.00%

内存: 击败了41.80%

 226.翻转二叉树

题意:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

 

【输入样例】

root = [4,2,7,1,3,6,9]

【输出样例】

[4,7,2,9,6,3,1]

解题思路:递归

1. 不断将当前节点的左右子树交换,递归实现

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            return root;
        }
        //左右子树交换
        TreeNode temp = root.right;
        root.right = root.left;
        root.left =  temp;
        //交换左子树
        invertTree(root.left);
        //交换右子树
        invertTree(root.right);
        return root;
    }
}

时间: 击败了100.00%

内存: 击败了88.10%

 101.对称二叉树

题意:

给你一个二叉树的根节点 root , 检查它是否轴对称。

 

【输入样例】

root = [1,2,2,3,4,4,3]

【输出样例】

true

解题思路:递归

1. 递归函数判断节点的左子树和右子树是否对称;把左子树和右子树拆开,题目就转变成了判断相同的树了。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        return cmp(root.left, root.right);
    }
    public boolean cmp(TreeNode root1, TreeNode root2){
        if(root1 == null && root2 == null){
            return true;
        }
        if(root1 == null || root2 == null || root1.val != root2.val){
            return false;
        }
        return cmp(root1.left,root2.right) && cmp(root1.right,root2.left);

    }
}

时间: 击败了100.00%

内存: 击败了82.85%

 105.从前序与中序遍历序列构造二叉树

题意:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

 

【输入样例】

preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]

【输出样例】

[3,9,20,null,null,15,7]

解题思路:

1. 先序遍历的过程是:根 左 右;中序遍历的过程是:左 根 右。

2. 根据规律,首先需要找到的是根节点,inorder数组中根左边的是左子树,根右边的是右子树;

3. 之后分别构造左子树和右子树;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private Map<Integer,Integer> indexMap;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = preorder.length;//一共n个节点
        //构造哈希映射,快速定位根节点
        indexMap = new HashMap<Integer,Integer>();
        for(int i=0;i<n;i++){
            indexMap.put(inorder[i],i);
        }
        return myBuildTree(preorder,inorder,0,n-1,0,n-1);
    }

   public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
        if (preorder_left > preorder_right) {
            return null;
        }
        //前序遍历找到根节点
        int preorder_root = preorder_left;
        //中序遍历定位根节点
        int inorder_root = indexMap.get( preorder[preorder_root]);

        //建立根节点
        TreeNode root = new TreeNode(preorder[preorder_root]);
        //确定左子树节点数目
        int size_left_subtree = inorder_root - inorder_left;
        //递归构造左子树,连接到根节点
        root.left = myBuildTree(preorder,inorder,preorder_left+1,preorder_left+size_left_subtree,
        inorder_left, inorder_root-1);

        //递归构造右子树
        root.right = myBuildTree(preorder,inorder,preorder_left+size_left_subtree+1, preorder_right,
        inorder_root+1, inorder_right);
        return root;
   }
}

时间: 击败了99.18%

内存: 击败了23.53%

 106.从中序与后序遍历序列构造二叉树

题意:

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

【输入样例】

inorder = [9,3,15,20,7],postorder = [9,15,7,20,3]

【输出样例】

[3,9,20,null,null,15,7]

解题思路:

1. 中序遍历的过程是:左 根 右; 后序遍历的过程是:左 右 根 ;。

2. 根据规律,首先需要找到的是根节点,inorder数组中根左边的是左子树,根右边的是右子树;

3. 之后分别构造左子树和右子树;

class Solution {
    private Map<Integer,Integer> indexMap;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int n = postorder.length;//一共n个节点
        //构造哈希映射,快速定位根节点
        indexMap = new HashMap<Integer,Integer>();
        for(int i=0;i<n;i++){
            indexMap.put(inorder[i],i);
        }
        return myBuildTree(inorder,postorder,0,n-1,0,n-1);
    }

   public TreeNode myBuildTree(int[] inorder,int[] postorder, int inorder_left, int inorder_right,int  postorder_left, int postorder_right) {
        if (postorder_left > postorder_right || inorder_left > inorder_right) {
            return null;
        }
        //后序遍历找到根节点
        int postorder_root = postorder[postorder_right];
        //中序遍历定位根节点
        int inorder_root = indexMap.get(postorder_root);

        //建立根节点
        TreeNode root = new TreeNode(postorder_root);
        //确定左子树节点数目
        int size_left_subtree = inorder_root - inorder_left;
        //递归构造左子树,连接到根节点
        root.left = myBuildTree(inorder, postorder, inorder_left, inorder_root-1,
        postorder_left,postorder_left+size_left_subtree-1);

        //递归构造右子树
        root.right = myBuildTree(inorder,postorder, inorder_root+1, inorder_right,
        postorder_left+size_left_subtree,postorder_right-1);
        return root;
   }
}

时间: 击败了99.21%

内存: 击败了61.89%

 117.填充每个节点的下一个右侧节点指针Ⅱ

题意:

给定一个二叉树:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

 

【输入样例】

root=[1,2,3,4,5,null,7]

【输出样例】

[1,#,2,3,#,4,5,7,#]

解题思路:

利用宽度优先搜索完成本题

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
        if(root== null){
            return root;
        }
        //队列存储节点信息
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            //每一层的数量
            int levelCount = queue.size();
            //前一个节点
            Node pre = null;
            for(int i=0;i<levelCount;++i){
                //出队
                Node node = queue.poll();
                if(pre != null){
                    //不是第一个节点
                    pre.next = node;
                }
                pre = node;
                //查看左右节点是否为空,不空入队
                if(node.left != null){
                    queue.add(node.left);
                }
                if(node.right != null){
                    queue.add(node.right);
                }
            }
        }
        return root;
    }
}

时间: 击败了76.40%

内存: 击败了5.16%

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能井盖传感器,物联网智能井盖系统

随着城市人口的不断增加和城市化进程的不断推进&#xff0c;城市基础设施的安全和可靠性变得愈发重要&#xff0c;城市窨井盖作为城市基础设施重要组成部分之一&#xff0c;其安全性事关城市安全有序运行和居民生产生活安全保障。 近年来&#xff0c;各地都在加强城市窨井盖治理…

【C/C++】多态的概念 | 虚函数 | 虚函数指针

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

STM32 BOOT 启动配置 ISP升级 介绍

启动配置 在STM32F10xxx里&#xff0c;可以通过BOOT[1:0]引脚选择三种不同启动模式。 启动模式选择引脚启动模式说明BOOT1BOOT0X0主闪存存储器主闪存存储器被选为启动区域01系统存储器系统存储器被选为启动区域11内置SRAM内置SRAM被选为启动区域 在系统复位后&#xff0c; S…

Kafka核心原理第一弹——更新中

架构原理 一、高性能读写架构原理——顺序写零拷贝 首先了解两个专业术语&#xff0c;研究kafka这个东西&#xff0c;你必须得搞清楚这两个概念&#xff0c;吞吐量&#xff0c;延迟。 写数据请求发送给kafka一直到他处理成功&#xff0c;你认为写请求成功&#xff0c;假设是…

WOFOST模型与PCSE模型应用

目录 第一章 理论基础 农作物生长模型概述 第二章 数据准备 第三章 WOFOST模型基础 第四章 PythonCropSimulationEnvironment 第五章 案例拓展 更多应用 实现作物产量的准确估算对于农田生态系统响应全球变化、可持续发展、科学粮食政策制定、粮食安全维护都至关重要。传…

怎么把pdf转换成jpg格式?

怎么把pdf转换成jpg格式&#xff1f;在我们日常的办公过程中&#xff0c;PDF文件是一个经常被使用来传输文件的格式。它能够确保我们的文件内容不会混乱&#xff0c;并以更加完美的方式呈现出来。然而&#xff0c;PDF文件也存在一些缺陷。例如&#xff0c;它无法直接编辑&#…

linux和python轻松实现短信和邮件的秒发!四大实战脚本大揭秘!

引言 作为Linux和Python技术持续学习者&#xff0c;我们不仅要了解基础知识&#xff0c;还需要实际运用技术解决问题。本文将分享四个实用的Python和Linux运维脚本&#xff0c;帮助我们轻松实现短信和邮件的秒发功能。 要求环境 一台运行Linux操作系统的服务器&#xff08;可以…

SQL Server软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 SQL Server是一种关系型数据库管理系统&#xff0c;由美国微软公司开发。它被设计用于存储、管理和查询数据&#xff0c;被广泛应用于企业级应用、数据仓库和电子商务等场景。 以下是SQL Server软件的主要特点和功能&#xff1…

面试题-React(六):React组件和生命周期

一、React组件 React组件简介&#xff1a; React组件是构建用户界面的基本单元。它们将界面拆分成独立、可重用的部分&#xff0c;使得代码更加模块化、可维护性更高。React组件可以是函数组件或类组件&#xff0c;它们接收输入的数据&#xff08;称为props&#xff09;并返回…

Dockerfile制作LAMP环境镜像

文章目录 使用Dockerfile制作LAMP环境镜像编写Dockerfile不修改默认页面修改默认页面 Start Script目录结构及文件登录私有仓库给镜像打标签上传镜像页面检查检测镜像可用性 使用Dockerfile制作LAMP环境镜像 编写Dockerfile 不修改默认页面 FROM centos:7 MAINTAINER "…

数据结构--递归与分治

汉诺塔分析&#xff1a; 以三层进行分析&#xff0c;大于三层分析情况是一样的。 #include <stdio.h>void move(int n,char x,char y,char z) {if(1 n){printf("%c---------->%c\n",x,z);}else{move(n-1,x,z,y);//将第n-1个盘子从x借助z移动到y printf(&q…

nmon的安装与使用

一、Linux服务器配置信息 操作系统&#xff1a;CentOS 7.6 64位&#xff08;可用命令&#xff1a;cat /etc/redhat-release和uname -a查看&#xff09; CPU&#xff1a;1核&#xff08;可用命令top查看&#xff09; 内存&#xff1a;2GB&#xff08;可用命令free查看&#xff…

修改Jupyter Notebook默认打开路径

这里我是重新下载的anaconda&#xff0c;打开Jupyter之后是默认在C盘的一个路径的&#xff0c;现在我们就来修改一下它的一个默认打开路径&#xff0c;这样在我们后续学习过程中&#xff0c;可以将ipynb后缀的文件放在这个目录下就能查看了。 1、先打开Anaconda Prompt&#x…

【大模型】基于 LlaMA2 的高 star 的 GitHub 开源项目汇总

【大模型】基于 LlaMA2 的高 star 的 GitHub 开源项目汇总 Llama2 简介开源项目汇总NO1. FlagAlpha/Llama2-ChineseNO2. hiyouga/LLaMA-Efficient-TuningNO3. yangjianxin1/FireflyNO4. LinkSoul-AI/Chinese-Llama-2-7bNO5. wenge-research/YaYiNO6. michael-wzhu/Chinese-LlaM…

jmeter 性能测试用 csv

⏩很多人在使用 jmeter 做接口测试、自动化测试和性能测试时&#xff0c;都喜欢用 CSV 数据文件设置功能&#xff0c;来读取准备好的测试数据。虽然这种方法并不是最优方案&#xff0c;在我们的性能测试课程中&#xff0c;讲解了更优的方案&#xff0c;但是&#xff0c;没有上过…

Elasticsearch算分优化方案之rescore_query

简介 今天来说一说Elasticsearch 的重新评分&#xff0c;即在检索出来一次结果的基础上在进行检索提升数据排序效果&#xff0c;但是仅对查询或者post_filter阶段返回的前多少条进行二次查询。在每个分片上进行二次检索的文档数量时可以通过window_size 控制的&#xff0c;该参…

对《VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库》的改进

《VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库》使用的Activex DLL公共对象是需要先注册的。https://blog.csdn.net/weixin_45707491/article/details/132437502?spm1001.2014.3001.5501 Activex DLL事前注册&#xff0c;一次多用说起来也不是啥大问题&#x…

[C++] STL_vector 迭代器失效问题

文章目录 1、前言2、情况一&#xff1a;底层空间改变的操作3、情况二&#xff1a;指定位置元素的删除操作4、g编译器对迭代器失效检测4.1 扩容4.2 erase删除任意位置&#xff08;非尾删&#xff09;4.3 erase尾删 5、总结 1、前言 **迭代器的主要作用就是让算法能够不用关心底…

Python通过matplotlib动态绘图实现中美GDP历年对比趋势动图

随着中国的各种实力的提高&#xff0c;经常在各种媒体上看到中国与各个国家历年的各种指标数据的对比&#xff0c;为了更清楚的展示历年的发展趋势&#xff0c;有的还做成了动图&#xff0c;看到中国各种指标数据的近年的不断逆袭&#xff0c;心中的自豪感油然而生。今天通过Py…

Eagle for Mac图片素材管理工具

Eagle for Mac是专门为mac用户设计的一款非常专业的图片素材管理软件&#xff0c;支持藏网页图片&#xff0c;网页截屏&#xff0c;屏幕截图和标注&#xff0c;自动标签和筛选等功能&#xff0c;让设计师方便存储需要的素材和查找&#xff0c;提供工作效率。 使用 Eagle 强大的…