11.21二叉树oj

news2025/1/11 20:47:36

目录

一.队列.栈顺序表总结

二.猫狗问题

三.股票价格跨度

四.二叉树的初始化

1.获取树中节点的个数

1.遍历思路

2.子问题思路

2.叶子节点个数

3.获取第K层节点的个数

4.获取二叉树的高度

6.判断一棵树是不是完全二叉树


一.队列.栈顺序表总结

1.顺序表和栈的底层都是动态数组

2.队列的底层是链表,如果继承Queue就是普通队列.如果继承Dueue就是双端链表

队列一般使用offer添加,,poll弹出.peek查看top

3.循环队列的底层也是数组

二.猫狗问题

这道题的思路就是构建两个队列

一个放进入收容所的动物队列

一个是放收养动物的队列.

然后因为这是二维数组,直接构建循环对每一组进行遍历

构建Switchcase语句对二维数组的每一组的第一个元素进行判断根据题意

如果是1,就把这一组的第二个元素放进list.

如果是2

那么就进入收养程序

如果是数组第二个元素是0 根据题意就是第一个元素,那么就开始遍历收养的队列,碰到不是0的就放入收养的队列,再把这个下标的元素设为0表示已经被收养然后就可以跳出循环

因为题目只要首次收养的

如果第二个元素不是0.那么就表示是有条件的,要么是大于0的狗要么是大于0的猫.那就还要建立两种判断条件,根据上面的一样,找到一个满足条件的并设置为0

直到数组遍历完.就可以返回收养的队列了

 import java.util.*;

public class CatDogAsylum {
    public ArrayList<Integer> asylum(int[][] ope) {
        // write code here
        ArrayList<Integer> input=new ArrayList<>();
        ArrayList<Integer> onput=new ArrayList<>();
        for(int i=0;i<ope.length;i++){
            switch(ope[i][0]){
                case 1:
                    input.add(ope[i][1]);
                    break;
                case 2:
                    if(ope[i][1]==0){
                        for(int j=0;j<input.size();j++){
                            if(input.get(j)!=0){
                                onput.add(input.get(j));
                                input.set(j,0);
                                break;
                            }
                        }
                    }else if(ope[i][1]>0){
                        for(int j=0;j<input.size();j++){
                            if(input.get(j)>0){
                                onput.add(input.get(j));
                                input.set(j,0);
                                break;
                            }
                        }
                        
                    }else{
                         for(int j=0;j<input.size();j++){
                            if(input.get(j)<0){
                                onput.add(input.get(j));
                                input.set(j,0);
                                break;
                            }
                        }
                    }
                    break;
            }
        }
        return onput;
    }
}

三.股票价格跨度

构建两个栈

一个正常放入数值

还有一个放入跨度的大小

设w为1

因为根据题意就算是第一天也是1

看放入的值有没有比栈顶元素大.如果大就让w+w栈弹出的元素.并让价格栈也弹出,构建循环,直到价格栈的栈顶大于放入的值,

然后把循环后的w放入w栈

最后返回w

class StockSpanner {
    Stack<Integer> prices;
    Stack<Integer> weight;
    public StockSpanner() {
        prices=new Stack<>();
        weight=new Stack<>();

    }
    
    public int next(int price) {
        int w=1;
        while(!prices.isEmpty()&&price>=prices.peek()){
            prices.pop();
            w+=weight.pop();
        }
        prices.push(price);
        weight.push(w);
        return weight.peek();
    }
}

四.二叉树的初始化

1.获取树中节点的个数

1.遍历思路

遍历二叉树,如果是节点,看是否是空的,不是就让计数器++

int size(TreeNode root){
    int count=0;
    if(root!=null){
        count++;
        count+=size(root.left);
        count+=size(root.right);
    }
    return count;
}

2.子问题思路

树中节点个数是左子树的个数+右子树个数+1(就是根节点)综合

int sizeSun(TreeNode root){
   if(root==null){
       return 0;
   }
   return sizeSun(root.left)+sizeSun(root.right)+1;
}

2.叶子节点个数

int getLeafNodeCount(TreeNode root){
    if(root==null){
        return 0;
    }
    if(root.left==null&&root.right==null){
        return 1;
    }
    return getLeafNodeCount(root.left)+getLeafNodeCount(root.right);
}

我刚开始没有考虑到递归的结束条件,就造成了空指针异常

应该加一条root==null

3.获取第K层节点的个数

这里的思路我觉得就是左子树层数和右子树层数节点总数,还是子问题思路

// 获取第K层节点的个数
int getKLevelNodeCount(TreeNode root,int k){
    if(root==null||k<=0){
        return 0;
    }
    if(k==1){
        return 1;
    }
    return getKLevelNodeCount(root.left,k-1)+getKLevelNodeCount(root.right,k-1);
}

4.获取二叉树的高度

思路

左子树高度和右子树高度的最大值.

这道题还是有一个注意点

就是在牛客计算中

如果这样算.会发现会超出时间限制

我们要注意不要重读计算

这道题的时间复杂度因为没有循环 就是递归的次数,有多少节点那就递归多少次也就是O(n)

空间复杂度.就要看左子树和右子树的最大高度选一个

因为这个题会不停的像一边开辟空间.那么空间复杂度也就是最大高度log2n.

5. 检测值为value的元素是否存在

这还是一样的思路/检验左子树和右子树是否有

这里跟之前的子问题遍历是一样的思路,

那就需要调用左边的然后接收这个左子树的节点值,来找,如果左边还没有

再调用右边的再右边找,如果右边还没有

就说明这棵树没有

// 检测值为value的元素是否存在
TreeNode find(TreeNode root, char val){
    if(root==null) {
        return null;
    }
    if(root.val==val){
        return root;
    }
    TreeNode ret=find(root.left,val);
    if(ret!=null){
        return ret;
    }
    ret=find(root.right,val);
    if(ret !=null){
        return ret;
    }
    return null;

}

因为可能是空的 ,所以处理一下异常

6.判断一棵树是不是完全二叉树

就构建两个队列,这道题最好用非递归的思路去做

构建循环,r

遍历一个节点就放入队列中,

然后弹出判断是否为空

不为空就弹入左节点右节点

然后再按顺序弹出判断

如果是非完全二叉树,他放入的顺序不是按左右左右放的,所以会出现null.节点这种情况

boolean isCo(TreeNode root){
    if(root == null) return true;
    Queue<TreeNode> queue=new LinkedList<>();
    queue.offer(root);
    while(true){
        TreeNode ret=queue.poll();
        if(ret!=null){
            queue.offer(ret.left);
            queue.offer(ret.right);
        }else{
            break;
        }
    }
    while(!queue.isEmpty()){
        if(queue.peek()!=null){
            return false;
        }
        queue.poll();
    }
    return true;
}

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

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

相关文章

C++ 单向链表手动实现(课后作业版)

单向链表&#xff0c;并实现增删查改等功能 首先定义节点类&#xff0c;类成员包含当前节点的值和下一个节点的地址 /node definition template <typename T> class Node { public:T value;Node<T>* next;Node() {}Node(const T& value) {this->value va…

ES6 入门教程 19 Generator 函数的语法 19.7 yield星号表达式

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程19 Generator 函数的语法19.7 yield* 表达式19 Generator 函数的语法 19.7 yield* 表达式 如果在 Generator 函数内部&…

windows域控批量创建账号方法

目录 一、收集信息 二、编写脚本 &#xff08;一&#xff09;新建aduser.ps1的powershell脚本 &#xff08;二&#xff09;New-Aduser命令详解 三、生产环境报错 &#xff08;一&#xff09;ConvertTo-SecureString &#xff08;二&#xff09;指定的账号已存在 &#xff…

debian11 安装后必备配置

debian11 安装后必备配置 运行环境&#xff1a;PVE v7.2-11 CT容器 系统版本&#xff1a;Debian-11-standard_11.3-1_amd64.tar.zst 启动信息 Debian GNU/Linux 11 debian tty1debian login: root Password: Linux debian 5.15.64-1-pve #1 SMP PVE 5.15.64-1 (Thu, 13 Oct …

【数据结构】堆的实现堆排序Top-K

文章目录一、堆的概念及结构二、堆实现&#xff08;1&#xff09;创建结构体&#xff08;2&#xff09;具体函数实现及解析1.0 交换函数1.1 堆的打印1.2 堆的初始化1.3 堆的销毁1.4 堆的插入1.5堆的向上调整算法1.6 堆的删除1.7堆的向下调整算法1.8 取堆顶的数据1.9 堆的数据个…

【力扣练习】找一个字符串中不含有重复字符的最长字串的长度

class Solution: def lengthOfLongestSubstring(self, s: str) -> int: # 哈希集合&#xff0c;记录每个字符是否出现过 occ set() n len(s) # 右指针&#xff0c;初始值为 -1&#xff0c;相当于我们在字符串的左边界的左侧&#xff…

【项目实战】Spring Boot项目抵御XSS攻击

本专栏将为大家总结项目实战相关的知识&#xff01; 点击即可关注本专栏&#xff0c;获取更多知识&#xff01; 文章目录前言一、什么是XSS攻击二、如何抵御XSS攻击三、实现抵御XSS攻击结语前言 作为Web网站来说&#xff0c;抵御XSS攻击是必须要做的事情&#xff0c;这是非常常…

C++基础知识

目录 C的基本使用 C数据的输入与输出 C使用命令行 具体案例 C生成随机数 关键字 标识符命名规则 数据类型 整形 实型&#xff08;浮点型&#xff09; 浮点型变量分为2种 表示小数的两种方式 案例演示 字符型 案例演示 字符串类型 两种风格 两种风格字符串之间…

【MyBatis】MyBtis入门程序

1. 目录结构 2. 数据库表的设计 /*Navicat Premium Data TransferSource Server : MysqlSource Server Type : MySQLSource Server Version : 50726Source Host : localhost:3306Source Schema : mybatisTarget Server Type : MySQLTarget Se…

python_循环

一、while循环的基础语法程序中的循环&#xff1a;while 条件&#xff1a;条件满足时&#xff0c;做的事情1条件满足时&#xff0c;做的事情2......即只要条件满足&#xff0c;会无限循环执行代码示例&#xff1a;# 简单示例&#xff1a;向Vivian表白100次i 0 while i < 10…

RabbitMQ系列【13】优先级队列

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言1. 设置优先级队列2. 消息设置优先级前言 RabbitMQ将消息写入队列中都是按顺序写的&#xff0c;消费时也是按顺序进行消费&#xff0c;队列中的消息是先进先出(FIFO).。 首先测试一下没有优…

多数银行人都会忽略5个影响系统性能的因素总结

性能测试往往在投产上线前开展&#xff0c;无法对整个系统变更进行全面的覆盖测试&#xff0c;因此性能测试需求提出十分关键。 性能测试需求交付过程中&#xff0c;需要对开发团队提出的测试需求进行审查&#xff0c;重点分析交付的测试需求是否充分覆盖了影响系统性能的因素…

【OpenCV-Python】教程:3-7 Canny边缘检测

OpenCV Python Canny 边缘检测 【目标】 Canny 边缘检测的概念cv2.Canny 【原理】 1. 去噪 由于边缘检测非常容易收到图像的噪声影响&#xff0c;第一步使用 5x5 高斯滤波去除图像中的噪声。 2. 寻找图像的亮度梯度 在平滑后&#xff08;去噪后&#xff09;的图像利用 S…

1.5 阻塞与非阻塞I/O

文章目录1、阻塞I/O2、非阻塞I/O3、异步I/O4、同步I/O5、epoll原理函数5.1、int epoll_create(int size)5.2、int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event)5.3、int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout)5.4、内核…

【Linux 线程介绍】

Linux 线程线程一定越多越好吗&#xff1f;线程的实现方式&#xff1a;API:pthread_exit函数演示获取线程的返回值多线程的不安全性查看进程中的线程数进程&#xff1a;一个正在运行的程序 &#xff0c;资源分配的基本单位 线程&#xff1a;进程内部的一条执行序列&#xff08;…

接口自动化测试

接口自动化测试1.基础知识1.接口测试原理2.接口测试点及用例设计方法3.接口测试返回值的处理4.接口测试要点5.常见HTTP状态码6.HTTP基础知识7.接口自动化测试工具2.抓包工具1.chrom抓包2.Fiddle抓包&#xff08;PC端&#xff0c;手机端&#xff09;1.原理2.下载安装3. 认识界面…

HIbernate多表学习

一&#xff0c;表与表之间关系&#xff1a; 1.一对多&#xff1a;多的表用一个外键存一的表的主键id。 2.多对多&#xff1a;新建第三张表&#xff0c;两个外键分别存两个多的表的主键id。 3.一对一 二&#xff0c;Hibernate一对多练习&#xff1a; 一对多映射配置&#…

国际通用回收标准-GRS、RCS的答疑

【国际通用回收标准-GRS、RCS的答疑】 GRS & RCS 国际通用回收标准 GRS和 RCS是目前现行国际公认的回收材料标准。许多国际知名品牌如 ADDIDAS、3M、PUMA、H&M、NIKE等都是此标准的会员。GRS与 RCS最早开始于纺织产业&#xff0c;用以证明其产品或原料含有一定的回收材…

yolov5剪枝实战4: 正常训练和稀疏化训练

1. 准备自己的数据集 1.1 下载项目文件 准备好备注的数据集进行训练,我这里给出了标注好的足球的数据集。从百度网盘下载到项目目录下并解压,网盘地址见文末 VOCdevkit_ball.ziptestfiles.zipprepare_data.py1.2 解压建立或自行建立数据集 使用PASCAL VOC数据集的目录结构,…

怎么批量把图片转文字?教你几招轻松完成

工作中我们经常要与图片、文字打交道&#xff0c;特别是做资料收集的小伙伴&#xff0c;当收到图片资料的时候&#xff0c;就需要将其输出为文字进行保存&#xff0c;如果是单张的时候我们还可以使用手机或者微信直接拍照识别转&#xff0c;但是图片不止一张的时候&#xff0c;…