【刷题】Leetcode 1609.奇偶树

在这里插入图片描述

Leetcode 1609.奇偶树

  • 题目描述
    • 广度优先搜索(BFS)
    • 深度优先算法(DFS)
  • 思路一(BFS)
  • 思路二(DFS)
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

题目描述

在这里插入图片描述
根据题目信息,我们可以整理出一些基本思路。

  1. 首先我们需要想办法遍历每层数据 其中需要记录二叉树当前深度。
  2. 遍历的过程中进行判断,不符合要求就返回false

基本就需要做到这两大板块就可以完成我们的任务了。重要的是这个过程如何实现:这里我们用到两个常用方法:广度优先搜索 (BFS)和 深度优先搜索(DFS)。下面初步解释一下两种算法:

广度优先搜索(BFS)

广度优先搜索是连通图的一种遍历算法,是很多重要图算法的原型(比如Dijkstra最短路径算法和Prim最小生成树算法)。它是一种盲目搜索法,目的是展开并检查图中的所有节点,进而得到结果。
过程是十分暴力的,不考虑结果的具体位置,直接遍历搜索所有节点,直到找到结果为止。基本过程是从根节点开始,沿着树(图)遍历所有节点,访问完所以节点后算法终止。常使用队列(FIFO)辅助实现BFS算法。

深度优先算法(DFS)

深度优先算法是图论的经典算法,是针对图和树的遍历算法(比如前序遍历,中序遍历,后序遍历)。利用深度优先算法可以产生目标图的对应拓扑排序表,进而方便的解决问题(如最大路径算法)。
其过程简单来说是对一个可能分支进行处理到不能再进行处理为止。如果是死路就返回,返回图中遇见未探索的分支就进行进行处理,直到达到要求。一般使用堆或栈来辅助实现DFS算法。

思路一(BFS)

根据上面的介绍我们可以通过队列来辅助我们进行遍历所有树。
具体分为两个循环嵌套:

  1. 首先外围while 保证访问所有节点,并记录深度。
  2. 内层for循环 负责处理该层所有节点,并将下一层节点存入队列中。

接下来是一些细节:

  1. leve记录层数 (注意从0开始)
  2. prev 记录上一个节点数
  3. value记录当前节点数
  4. prev 处理完每个节点后 需要迭代。
  5. 每层处理结束后 level++
    这两个循环是算法的核心部分, 保证了遍历所有节点.
    来看代码实现(选择使用C++ 比较方便)
class Solution {
public:bool isEvenOddTree(TreeNode* root) {//建立队列queue<TreeNode*> qu;//先入根节点qu.push(root);//设置层数int level = 0;//开始遍历 队列全为空就结束while(!qu.empty()){//prev 为前一个节点值 这里进行初始化//偶数下标 层上的所有节点的值都是 奇整数,从左到右按顺序严格递增//所以 prev设置为最小值//奇数下标 层上的所有节点的值都是 偶整数,从左到右按顺序严格递减//所以 prev设置为最大值int prev = level % 2 == 0 ? INT_MIN : INT_MAX;//获取当前层节点个数int size = qu.size();//进入该层循环for(int i = 0 ; i < size ;i++){//出队列 得到节点TreeNode* node = qu.front();qu.pop();//获取当前节点值int value = node->val;//节点值 与 该层数奇偶不符 返回 falseif(value % 2 == level % 2) return false;//偶数下标层 必须满足严格递增 通过当前值与上一个节点值进行判断if(level % 2 == 0 && value <= prev) return false;//奇数下标层 必须满足严格递减 通过当前值与上一个节点值进行判断if(level % 2 == 1 && value >= prev) return false;//进行入队列处理if(node->left) qu.push(node->left);if(node->right) qu.push(node->right);//该节点结束 先前节点值迭代prev = value;}//层数增加level++;}//全部满足条件 返回真即可return true;}
};

来看效果:
在这里插入图片描述
过啦!!! 大声欢呼!!!

思路二(DFS)

该思路使用递归,所以有点不太好理解,动态规划好DFS 的混合运算了属于。
我们写出的dfs函数主要完成以下工作:
bool dfs(TreeNode* root,int p)

  1. root 为当前节点 p 为层数 dp[ p ]储存该层最新的数值
  2. 首先判断是否满足基本条件:
    偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增
    奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减
    判断递增递减是通过 当前节点值与dp[ p ]的值进行比较
    满足条件就更新dp[ p ] 值
  3. 然后进行下一层的判断
  4. 直到处理完所有数据。
//设置常量 方便使用
const int N = 1e5 + 7;
const int MAX = 0x3f3f3f3f;
class Solution {
public:// dp[]数组储存上一个符合要求的值 int dp[N + 1];bool dfs(TreeNode* root,int p){//记录当前节点值int value = root->val;//奇数下标层 必须满足严格递减 通过当前值与上一个节点值进行判断if(p & 1){if(value & 1 || value >= dp[p]) return false;}//偶数下标层 必须满足严格递增 通过当前值与上一个节点值进行判断else{if(!(value & 1) || value <= dp[p]) return false;}//满足条件就更新数组值dp[p] = value;//继续深入处理if(root->left && !dfs(root->left,p+1)) return false;if(root->right && !dfs(root->right,p+1)) return false;//符合要求 返回真return true;}bool isEvenOddTree(TreeNode* root) {for(int i = 0;i<N;i+=2) {dp[i] = 0;//偶数下标 需要递增所以使用最小值0dp[i + 1] = MAX;//奇数下标 需要递增所以使用最小值0}return dfs(root,0);}
};

来看效果:
在这里插入图片描述
过啦!!!!!!!!!!!!!!!!!!!

这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫的危害,如何有效的防止非法利用

近年来&#xff0c;不法分子利用“爬虫”软件收集公民隐私数据案件屡见不鲜。2023年8月23日&#xff0c;北京市高级人民法院召开北京法院侵犯公民个人信息犯罪案件审判情况新闻通报会&#xff0c;通报侵犯公民个人隐私信息案件审判情况&#xff0c;并发布典型案例。在这些典型案…

FMM 笔记:st-matching(colab上执行)【官方案例解读】

在colab上运行&#xff0c;所以如何在colab上安装fmm&#xff0c;可见FMM 笔记&#xff1a;在colab上执行FMM-CSDN博客 st-matching见论文笔记&#xff1a;Map-Matching for low-sampling-rate GPS trajectories&#xff08;ST-matching&#xff09;-CSDN博客 0 导入库 from…

【vuex之五大核心概念】

vuex:五大核心概念 一、state状态1.state的含义2.如何访问以及使用仓库的数据&#xff08;1&#xff09;通过store直接访问获取store对象 &#xff08;2&#xff09;通过辅助函数MapState 二、mutations1.作用2.严格模式3.操作流程定义 mutations 对象&#xff0c;对象中存放修…

Parquet 文件生成和读取

文章目录 一、什么是 Parquet二、实现 Java 读写 Parquet 的流程方式一&#xff1a;遇到的坑&#xff1a;坑1&#xff1a;ClassNotFoundException: com.fasterxml.jackson.annotation.JsonMerge坑2&#xff1a;No FileSystem for scheme "file"坑3&#xff1a;与 spa…

第四十三天| 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

01背包问题 Leetcode 1049. 最后一块石头的重量 II 题目链接&#xff1a;1049 最后一块石头的重量 II 题干&#xff1a;有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将…

网域图片的访问下载路径

网域图片的本身内容资源在网络空间中的访问下载路径

Unity(第十七部)Unity自带的角色控制器

组件Character Controller 中文角色控制器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class player : MonoBehaviour {private CharacterController player;void Start(){player GetComponent<CharacterController>();}v…

Linux基本指令(上)

在Linux中&#xff0c;将文件夹称为目录&#xff0c;后面的内容都与目录相关。 1. ls指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项 …

Java ElasticSearch-Linux面试题

Java ElasticSearch-Linux面试题 前言1、守护线程的作用&#xff1f;2、链路追踪Skywalking用过吗&#xff1f;3、你对G1收集器了解吗&#xff1f;4、你们项目用的什么垃圾收集器&#xff1f;5、内存溢出和内存泄露的区别&#xff1f;6、什么是Spring Cloud Bus&#xff1f;7、…

Springboot解决模块化架构搭建打包错误找不到父工程

Springboot解决模块化架构搭建打包错误找不到父工程 一、情况一找不到父工程依赖1、解决办法 二、情况二子工程相互依赖提示"程序包xxx不存在" 一、情况一找不到父工程依赖 报错信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:…

使用Node.js构建一个简单的聊天机器人

当谈到人工智能&#xff0c;我们往往会想到什么&#xff1f;是智能语音助手、自动回复机器人等。在前端开发领域中&#xff0c;我们也可以利用Node.js来构建一个简单而有趣的聊天机器人。本文将带你一步步实现一个基于Node.js的聊天机器人&#xff0c;并了解其工作原理。 首先…

安装 Ubuntu 22.04.3 和 docker

文章目录 一、安装 Ubuntu 22.04.31. 简介2. 下载地址3. 系统安装4. 系统配置 二、安装 Docker1. 安装 docker2. 安装 docker compose3. 配置 docker 一、安装 Ubuntu 22.04.3 1. 简介 Ubuntu 22.04.3 是Linux操作系统的一个版本。LTS 版本支持周期到2032年。 系统要求双核 C…

linux c++ 开发 tensorrt 安装

tensorrt 官方下载地址&#xff08;需要注册账号登录&#xff09;&#xff1a;Log in | NVIDIA Developer 根据系统发行版和CUDA版本 (nvcc -V) 选择合适的安装包 EA&#xff08;early access&#xff09;版本代表抢先体验。 GA&#xff08;general availability&#xff09;代…

创新永不止步,织信低代码平台继续加速前进!

2023年&#xff0c;织信低代码首创“企业级”低代码概念&#xff0c;定位服务企业数字化升级战略。 经历了全年14个大版本的升级&#xff0c;下面就来细数一下2023的重大功能更新&#xff01; 1、组件设计器 织信团队凭借丰富的项目实施经验和深入客户需求理解&#xff0c;重…

vue3 构建项目

一.使用vite构建&#xff1a; npm init vitelatest 项目名称 构建的项目模板 进入项目 cd 项目名称 安装项目依赖包 npm install 启动项目 npm run dev 二.使用vue脚手架构建&#xff1a; npm init vuelatest 后续基本差不多

Win11系统安装安卓子系统教程

随着Win11系统的不断普及&#xff0c;以及硬件设备的更新换代&#xff0c;我相信很多同学都已经更新并使用到了最新的Win11系统。那么&#xff0c;Win11系统最受期待的功能“Windows Subsystem for Android”&#xff08;简称WSA&#xff09;&#xff0c;即《安卓子系统》。他可…

高马步和四平马步总结

目录 一.高马步武当袁师懋视频讲解高马步要点总结其它零散总结 二.四平马步先开胯&#xff0c;开胯的方法方法总结参考文章 三.站桩问题总结站桩时脚部灼烧感 四.记录2024 1.17 站桩突破25分钟2024年 3.1 晚上尝试四平马步&#xff0c;突破10分钟 站桩脚趾要抓地吗站桩文章 一.…

[AutoSar]BSW_Com03 DBC详解 (一)

目录 关键词平台说明一、DBC 定义1.1 相关工具 二、主要组成部分介绍2.1 Networks2.2 ECUs2.3 Network nodes2.4 messages2.5 signal2.6 Value Tables 三、主要组成部分关系图 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &am…

[Vulnhub]靶场 Web Machine(N7)

kali:192.168.56.104 主机探测: arp-scan -l 靶机ip:192.168.56.104 端口扫描 nmap -p- 192.168.56.106 看一下web 目录扫描 gobuster dir -u http://192.168.56.106 -x html,txt,php,bak,zip --wordlist/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt exp…

将仓库A中的部分提交迁移到仓库B中

结论&#xff1a; 使用git format-patchgit am即可实现 使用场景&#xff1a; 例如仓库A这里有5个提交记录&#xff0c;commitid1, commitid2, commitid3, commitid4&#xff0c;commitid5 仓库B想用仓库A中提交的代码&#xff0c;手动改比较慢&#xff0c;当改动较多的时候…