【刷题】杨辉三角

news2024/11/13 12:55:57

目录

  • 杨辉三角
    • 题目描述
    • 解题思路
    • 解题代码
  • 相同的树
    • 题目描述
    • 解题思路
  • 二叉树的层序遍历
    • 题目描述
    • 解题思路
    • 解题代码
    • 从底层层序遍历
  • 二叉树的最近公共祖先
    • 题目描述
    • 解题思路
  • 从前序与中序遍历序列构建二叉树
    • 题目描述
    • 解题思路
  • 从后序与中序遍历序列构建二叉树
    • 题目描述
    • 解题思路
  • 根据二叉树创建字符串
    • 题目描述
    • 解题思路

在这里插入图片描述

杨辉三角

链接:杨辉三角

题目描述

题目描述如下:
在杨辉三角中当前数等于上一行的同一个列数和其前面一个数的和。
左右边界为1。
杨辉三角题目

解题思路

解题思路如下:
我们使用顺序表

  1. 先把

解题代码

class Solution {
    public List<List<Integer>> generate(int numRows) {
         List<List<Integer>> ret = new ArrayList<>();
         List<Integer> list = new ArrayList<>();
         //先把第一行安排
         list.add(1);
         ret.add(list);
         //处理后面除最后一个
         for(int i = 1; i < numRows; i++) {
             //记录当前行,并将第一个给1
         List<Integer> nowRow = new ArrayList<>();
         nowRow.add(1);
             //记录上一行
             List<Integer> perRow = new ArrayList<>();
             perRow = ret.get(i-1);
             //重第二个元素录入
             for(int j = 1; j < i; j++) {
                Integer a = perRow.get(j) + perRow.get(j-1);
                 nowRow.add(a);
             }
             //最后一个给1
             nowRow.add(1);
             ret.add(nowRow);   
         }
         return ret;
    }
}

相同的树

链接:相同的树

题目描述

解题思路

判断只有以下四种情况:

  • 两个树都为空。
  • 其中一棵树为空。
  • 当前节点值相同,递归调用判断左子树和右子树。
  • 当前节点值不同,返回false。
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        //两个树都为空
        if(p == null && q == null) return true;
        //其中一棵树为空
        if((p == null && q != null) || (p != null && q == null)) return false;
        //值相同
        if(p.val == q.val) {
           return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
        }
        //值不同
        return false;
    }
}

二叉树的层序遍历

链接:二叉树的层序遍历

题目描述

解题思路

解题思路如下:

  1. 先创建一个二维数组,如果树为空,就返回空的二维数组,不要返回null。
  2. 再根据层序遍历思路,将根结点入队,循环遍历直到队列为空。
  3. 求当前队列的长度,以长度为循环条件(因为如此每次循环都将只保留本次循环入队的元素)取出队列的元素,放入一维数组,并将该元素不为空的左右孩子入队。
  4. 每出一次循环就将一维数组存入二维数组。

解题代码

代码如下:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //结果数组
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root == null){
            return ret;//必须返回空的二维数组
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            //每层数据
            List<Integer> level = new ArrayList<Integer>();
            int size = queue.size();
            //根据每层元素数循环
            while(size > 0){
                TreeNode cur = queue.poll();
                level.add(cur.val);
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            ret.add(level);
        }
        return ret;
    }
}

从底层层序遍历

链接:二叉树的层序遍历II
跟头层序遍历一样,只需要将插入ret结果时变为头插即可。

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if(root == null){
            return ret;//必须返回空的二维数组
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            //每层数据
            List<Integer> level = new ArrayList<Integer>();
            int size = queue.size();
            //根据每层元素数循环
            while(size > 0){
                TreeNode cur = queue.poll();
                level.add(cur.val);
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            ret.addFirst(level);
        }
        return ret;
    }
}

二叉树的最近公共祖先

链接:二叉树的最近公共祖先

题目描述

描述如下图:

解题思路

我们先思考有哪些情况:

  • 两个节点在其中一棵树的左右。
  • 两个节点有一个节点是祖先。

思路:

  1. 先看树是否为空,为空返回null。
  2. 判断当前根节点是不是所求节点。
  3. 左子树右子树找祖先。
  4. 根据得到情况判断:
  5. 如果当前根节点左右都得到值,那根节点就是共同祖先,对应情况一。
  6. 如果只有一方有值,那该值就是共同祖先,对应情况二。
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    	//树是否为空
        if(root == null){
            return null;
        }
        //根节点判断
        if(root == p || root == q){
            return root;
        }
        TreeNode retLeft = lowestCommonAncestor(root.left,p,q);
        TreeNode retRight = lowestCommonAncestor(root.right,p,q);
        if(retLeft != null && retRight != null){//根两边
            return root;
            //一个节点为祖先
        }else if(retRight == null){
            return retLeft;
        }else{
            return retRight;
        }
    }
}

从前序与中序遍历序列构建二叉树

链接:从前序与中序遍历序列构建二叉树

题目描述

解题思路

前序遍历得到的节点顺序是 根节点,左子树,右子树。
中序遍历得到的节点顺序是 左子树,根节点,右子树。

  1. 先从前序遍历结果从前往后依次拿到节点。
  2. 将该节点作为根节点然后依次创建左子树右子树(因为前序遍历是根左右)。
  3. 我们在中序遍历结果中根节点左边就是左子树包含节点,根节点右边就是右子树包含节点,所以创建子树时将范围给进去。

易错点:如果前序遍历的下标不是成员变量而是局部变量,那么每次递归拿到的都是0。

class Solution {
    private int preorderIndex;
    public TreeNode buildTree(int[] preorder, int[] inorder) {   
        return build(preorder,inorder,0,inorder.length-1);
    }
    public TreeNode build(int[] preorder, int[] inorder, int begin, int end) {
        //没有子树
        if(begin > end) {
            return null;
        }
        TreeNode root = new TreeNode(preorder[preorderIndex]);
        preorderIndex++;
        int rootIndex = findRootIndex(inorder,root.val,begin,end);
        root.left = build(preorder,inorder,begin,rootIndex - 1);
        root.right = build(preorder,inorder,rootIndex+1,end);
        return root;

    }
    private int findRootIndex(int[] inorder, int val,int begin, int end) {
        for(int i = begin; i <= end; i++){
            if(inorder[i] == val) return i;
        }
        return -1;
    }
}

从后序与中序遍历序列构建二叉树

题目描述

解题思路

中序遍历得到的节点顺序是 左子树,根节点,右子树。
后序遍历得到的节点顺序是 左子树,右子树,根节点。

依据前面的前序中序构建,我们只需要修改从后面开始遍历拿到后序遍历的结果在依次创建右子树,左子树即可。

class Solution {
    public int postorderIndex;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        postorderIndex = postorder.length - 1;
        return build(inorder,postorder,0,inorder.length-1);
    }
    private TreeNode build(int[] inorder, int[] postorder, int begin, int end) {
        if(begin > end) return null;
        TreeNode root = new TreeNode(postorder[postorderIndex]);
        postorderIndex--;
        int rootIndex = findRootIndex(inorder,root.val,begin,end);
        root.right = build(inorder,postorder,rootIndex+1,end);
        root.left = build(inorder,postorder,begin,rootIndex-1);
        return root;
    }
    private int findRootIndex(int[] inorder, int val,int begin, int end) {
        for(int i = begin; i <= end; i++){
            if(inorder[i] == val) return i;
        }
        return -1;
    }
}

根据二叉树创建字符串

根据二叉树创建字符串

题目描述


j

解题思路

节点有以下四种情况

  • 如果当前节点有两个孩子,那我们在递归时,需要在两个孩子的结果外都加上一层括号。
  • 如果当前节点没有孩子,那我们不需要在节点后面加上任何括号。
  • 如果当前节点只有左孩子,那我们在递归时,只需要在左孩子的结果外加上一层括号,而不需要给右孩子加上任何括号。
  • 如果当前节点只有右孩子,那我们在递归时,需要先加上一层空的括号 ‘()’ 表示左孩子为空,再对右孩子进行递归,并在结果外加上一层括号。
class Solution {
    public String tree2str(TreeNode root) {
        StringBuilder str = new StringBuilder();
        //没节点
        if(root == null) {
            return "";
        }
        str.append(root.val);
        //没孩子
        if(root.left == null && root.right == null) {
            return str.toString();
        }
        //左孩子为空
        if(root.left == null) {
            str.append("()");
            str.append("(");
            str.append(tree2str(root.right));
            str.append(")");
            return str.toString();
        }
        //右孩子为空
        if(root.right == null) {
            str.append("(");
            str.append(tree2str(root.left));
            str.append(")");
            return str.toString();
        }
        str.append("(");
        str.append(tree2str(root.left));
        str.append(")");
        str.append("(");
        str.append(tree2str(root.right));
        str.append(")");

        return str.toString();
    }
}

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

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

相关文章

SAP-MM-变式的设置

1、报表变式 业务需求: 业务人员查询报表时有些值是需要经常输入的,能不能设置成默认值?能不能设置成每次进入报表不选择变式直接是默认值? 解决措施: 1、事物码:MB51 以MB51物料凭证查询为例,其他报表自行举一反三 2、设置变式 首先进入MB51入下图 上图是没有选…

任天堂发言人:不会透露起诉《幻兽帕鲁》开发商细节

任天堂在昨天突然宣布将起诉《幻兽帕鲁》开发商 Pocketpair&#xff0c;除了引起许多玩家不满外&#xff0c;更多的是所有人的疑惑&#xff1a;因为实际上大家内心里觉得任天堂出手是理所当然的&#xff0c;但是为什么是在游戏发布数月后才选择起诉&#xff1f;此次诉讼是“专利…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.1-2.2

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第二周 深度卷积网络&#xff1a;实例探究&#xff08;Deep convolutional models: case studies&#xff09;2.1 为什么要进行实例探究&#xff1f;&#xff08;Why look at case studies?&…

Python编码系列—Python外观模式:简化复杂系统的快捷方式

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

生信初学者教程(八):数据收集

文章目录 数据分布表达谱数据最终数据分布自动下载GSE14520下载GSE149614下载其它数据在确定研究疾病为肝细胞癌**(Liver Hepatocellular Carcinoma: HCC)**后,系统地进行了文献回顾,专注于搜索与HCC相关的荟萃分析文章,以获取该领域的研究动态和已有成果。为了支持的研究…

卡车配置一键启动无钥匙进入手机控车

‌ 卡车智能一键启动无钥匙进入手机控车&#xff0c;通过手机应用程序与汽车内置硬件、软件的无线通信&#xff0c;实现对汽车的远程控制‌。 卡车改装一键启动的步骤包括安装门把手的感应装置、拆卸仪表台和门板&#xff0c;取出内部的待接线束&#xff0c;并将一键启动…

MySQL高阶1875-将工资相同的雇员分组

目录 题目 准备数据 分析数据 题目 编写一个解决方案来获取每一个被分配到组中的雇员的 team_id 。 返回的结果表按照 team_id 升序排列。如果相同&#xff0c;则按照 employee_id 升序排列。 这家公司想要将 工资相同 的雇员划分到同一个组中。每个组需要满足如下要求&a…

springboot结合p6spy进行SQL监控

1.学习p6spy的相关链接 英文文档&#xff1a;Integrating P6Spy — p6spy 3.9.2-SNAPSHOT documentationhttps://p6spy.readthedocs.io/en/latest/integration.html github链接&#xff1a;GitHub - p6spy/p6spy: P6Spy is a framework that enables database data to be sea…

solana项目counter,测试过程中执行报错记录分享

跟随HackQuest部署counter项目&#xff0c;使用 Solana 官方提供的 playgroud 。这个平台让我们的部署和测试过程变得更加简便高效。 合约代码 lib.rs中复制以下代码 use anchor_lang::prelude::*; use std::ops::DerefMut;declare_id!("CVQCRMyzWNr8MbNhzjbfPu9YVvr97…

12种常见的华为杯数学建模竞赛matlab代码(建议收藏)

1.使用神经网络模型(向量量子化方法LVQ)解决分类/预测问题 clc;clear;​% 第一类蝗虫的触角和翅膀p1 [1.24, 1.27; 1.36, 1.74; 1.38, 1.64; 1.38, 1.82; 1.38, 1.90; 1.40, 1.70; 1.48, 1.82; 1.54, 1.82; 1.56, 2.08];​% 第二类蝗虫的触角和翅膀p2 [1.14, 1.82;…

电脑视频编辑常用软件:12个在线视频剪辑方法,这份免费攻略真实在!

您是否曾为视频剪辑而感到困惑&#xff0c;不知从何入手&#xff1f;面对众多的视频编辑软件和复杂的操作流程&#xff0c;怎样才能快速上手&#xff0c;制作出高质量的视频呢&#xff1f;许多内容创作者在编辑或上传较长视频时&#xff0c;常常遭遇到时间和质量的困扰。为了解…

利用Metasploit进行信息收集与扫描

Metasploit之信息收集和扫描 在本文中&#xff0c;我们将学习以下内容 使用Metasploit被动收集信息 使用Metasploit主动收集信息 使用Nmap进行端口扫描 使用db_nmap方式进行端口扫描 使用ARP进行主机发现 UDP服务探测 SMB扫描和枚举 SSH版本扫描 FTP扫描 SMTP枚举 …

【计算机网络 - 基础问题】每日 3 题(十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

关于安卓App自动化测试的一些想法

安卓App自动化一般使用PythonAppium。页面元素通常是使用AndroidStudio中的UI Automator Viewer工具来进行页面元素的追踪。但是这里涉及到一个问题就是&#xff0c;安卓apk在每次打包的时候&#xff0c;会进行页面的混淆以及加固&#xff0c;所以导致每次apk打包之后会出现页面…

Java客户端SpringDataRedis(RedisTemplate使用)

文章目录 ⛄概述⛄快速入门❄️❄️导入依赖❄️❄️配置文件❄️❄️测试代码 ⛄数据化序列器⛄StringRedisTemplate⛄RedisTemplate的两种序列化实践方案总结 ⛄概述 SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模…

python获取滑块验证码需要滑动的距离

我们以这个网站为例: http://120.86.191.138/hbgs/zwgk/dirData.do?dirId402881204e959150014e959f42f30014&subjectId93e889f2501d3fe8015024305bdf0efc 往后点到第四页后会出现验证码 一.获取到背景图片和缺口图片 我们发现图片是base64格式通过API直接发送 二.识别缺…

铲屎官进!宠物空气净化器真的有用吗?哪款去浮毛效果好

国庆小长假就要来了&#xff0c;别人都在苦恼抢票问题&#xff0c;而我在想会不会被我妈赶出家门... 毕业后我就留在了广州上班&#xff0c;独自一人租房难免会感觉孤独&#xff0c;就养了一只小猫和我作伴。这次放假这么久&#xff0c;我不放心留它一个人在家&#xff0c;也没…

vulhub搭建漏洞环境docker-compose up -d命令执行报错以及解决方法汇总

在利用vulhub靶场搭建环境进行漏洞复现时&#xff0c;我们通常要使用这一步命令&#xff1a; docker-compose up -d 但是经常报错&#xff0c;今天我们来说几个常见的报错以及解决方法&#xff1a; 1.报错提示&#xff1a; ERROR: Couldnt connect to Docker daemon at httpdoc…

基于atlas环境下YOLOV7的睡岗识别

做到这里&#xff0c;其实只是想探索下新的检测框架、探索下atlas下ACL的推理方式。整个过程持续了3-4周把&#xff0c;回顾一下&#xff0c;感觉还是需要一些技巧才能拿下&#xff0c;如果没有任何经验的是断难搞定此代码的。主要基于华为的官方例子&#xff0c;里面修改了原始…

ApplicationEvent 事件泛型封装记录

一、一个事件的封装、发布以及监听 事件类封装 把需要的信息封装到一个事件类中 Data public class Person {private String name; }Data public class PersonEvent {private Person person;private String addOrUpdate;public PersonEvent(Person person, String addOrUpda…