【刷题】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.mzph.cn/news/712176.shtml

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

相关文章

ShardingSphere Narayana XA 事务不回滚问题定位

ShardingSphere Narayana XA 事务不回滚问题定位 问题背景 用户反馈&#xff0c;在使用 ShardingSphere Narayana 执行 XA 事务时&#xff0c;发生报错&#xff1a;java.sql.SQLException: javax.transaction.RollbackException: TransactionImple.enlistResource - ARJUNA0…

数字后端——DEF文件格式

文章目录 MACRO的不同orientationDEF中在macro orientation定义前需要留空格 MACRO的不同orientation DEF中在macro orientation定义前需要留空格 像下图中这种方向和分号之间没有空格的情况&#xff0c;就是有问题的格式。

C语言清空文件夹、C语言判断文件夹下的文件夹是否存在,如果存在就清空,如果不存在则建立

代码解法不唯一&#xff0c;请在评论区留下你的实现方式和想法&#xff0c;我会将好的解法更新到文章中&#xff01;&#xff01; 要在C语言中判断文件夹下的文件夹是否存在&#xff0c;如果存在就清空&#xff0c;如果不存在则建立&#xff0c;需要使用C标准库中的系统调用或…

数学学习与研究杂志社《数学学习与研究》杂志社编辑部2023年第29期目录

考试研究 提高高三数学二轮复习质量的思考与实践 佘淮青; 2-4 提升高三数学复习质量的策略探究 王飞; 5-7 核心素养背景下的高中数学命题策略研究 陈明发; 8-10 提升中考数学复习课的有效性研讨 韩兴宏; 11-13 中学教学方法《数学学习与研究》投稿&#xff1a;…

将c、c++变为python

1.编写cpp文件 #include "pycpp.h" #include <iostream>using namespace std;PyCpp::PyCpp(){}void PyCpp::sayHello(int a){cout << "Hello Python, I am C."<<a << endl; }2.编写头文件&#xff08;声明变量&#xff09; clas…

SpringBoot之自定义Redis缓存key的生成策略配置

SpringBoot之自定义Redis缓存key的生成策略配置 文章目录 SpringBoot之自定义Redis缓存key的生成策略配置1. SpringBoot版本2. Redis缓存配置类 自定义缓存key生成策略&#xff1b;key与value的序列化&#xff1b;key过期配置管理器 1. SpringBoot版本 <parent><group…

pyuic生成py文件到指定文件夹

pyuic生成py文件到指定文件夹 关于如何在pycharm配置外部工具的方法这里不做赘述&#xff0c;本文主要说明&#xff0c;如何利用pyuic将ui文件生成到指定的项目目录中。 前提条件&#xff1a;已配置的pyuic工具可以正常使用生成文件到目录中。 一、打开外部工具配置页面 打开…

如何用Python检查时间序列数据是否平稳?

时间序列数据通常以其时间性质为特征。这种时间性质为数据增加了趋势或季节性&#xff0c;使其与时间序列分析和预测兼容。如果时间序列数据不随时间变化或没有时间结构&#xff0c;则称其为静态数据。因此&#xff0c;检查数据是否平稳是非常必要的。在时间序列预测中&#xf…

用HTML5的<canvas>元素实现刮刮乐游戏

用HTML5的<canvas>元素实现刮刮乐 用HTML5的<canvas>元素实现刮刮乐&#xff0c;要求&#xff1a;将上面的“图层”的图像可用鼠标刮去&#xff0c;露出下面的“图层”的图像。 示例从简单到复杂。 简单示例 准备两张图像&#xff0c;我这里上面的图像top_imag…

node express实现Excel文档转json文件

有些场景我们需要将Excel文档中的内容抽取出来生成别的文件&#xff0c;作为一个前端&#xff0c;服务框架最应该熟悉的就是node了&#xff0c;以下是基于多语言转换实现代码&#xff0c;看明白原理自己改一改就能用了 1.安装node环境 2.创建一个文件夹&#xff0c;文件夹中创建…

7、Redis-事务、持久化、内存淘汰机制和过期key处理

目录 一、事务 二、持久化 三、内存淘汰机制 四、过期key处理 一、事务 Redis的事务本质上就是一个批量执行命令的操作。分为三个步骤&#xff1a; 开始事务&#xff1a;multi命令入队&#xff1a;正常输入命令即可执行事务&#xff08;依次执行命令&#xff09;&#xf…

掌握java模板方法模式,提升代码复用与扩展的艺术

Java 模板方法模式是一种行为型设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;并将一些步骤延迟到子类中实现。模板方法模式使得子类可以在不改变算法结构的情况下重定义算法中的某些步骤。 使用场景 算法骨架固定&#xff1a;如果一个算法的基本结构已经固定&#…

跨专业考研难度大吗?听听过来人的真实经历

在考研的大潮中&#xff0c;跨专业考研成为了一个不可忽视的现象。许多考生因为对原专业失去兴趣、追求职业梦想或其他原因&#xff0c;选择了跨专业报考。那么&#xff0c;跨专业考研的难度究竟有多大呢&#xff1f;今天&#xff0c;我们就来聊聊这个话题&#xff0c;听听过来…

不是我吹,这8道HashMap面试题让你面试时对答如流

前言 又到了一年一度的金三银四面试季&#xff0c;我们拿着自己的面试秘籍去面试&#xff0c;但是面试官的问题五花八门&#xff0c;让我们摸不清他们的套路。今天我就总结了面试时必问的hashmap面试题&#xff0c;无论面试官怎么问&#xff0c;我们都对答如流。 另外本人整理了…

java小记(2)

IS-A&#xff1a;类的父子继承关系。 default&#xff1a;关键字&#xff0c;与Java中的public&#xff0c;private等关键字一样&#xff0c;都属于修饰符关键字&#xff0c;可以用来修饰属性、方法以及类&#xff0c;但是default一般用来修饰接口中的方法。 接口与抽象类的区…

代码随想录算法训练营第二十四天 | 77. 组合

回溯算法理论基础 https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯法并不是什么高效的…

马斯克正式起诉OpenAI和奥特曼!

就在刚刚&#xff0c;马斯克闹出来一件大事——正式起诉OpenAI和Sam Altman&#xff0c;并要求OpenAI 恢复开源GPT-4等模型&#xff01; 众所周知&#xff0c;马斯克这两年一只在推特上指责 OpenAI是CloseAI(不开源)&#xff0c;但都只是停留在口头上。 而这次马斯克动了真格。…

nginx if 指令

目录 nginx if 指令直接判断变量判断是否等于字符串判断变量是否匹配正则表达式文件及目录判断示例1&#xff1a;判断index.html是否存在示例2&#xff1a;判断URL中是否存在某个参数Parameter示例3&#xff1a;判断URI中是否为某个特定路径示例4&#xff1a;开放白名单内的功能…

从0开始python学习-53.python中flask创建简单接口

目录 1. 创建一个简单的请求,没有写方法时默认为get 2. 创建一个get请求 3. 创建一个post请求&#xff0c;默认可以使用params和表单传参 4. 带有参数的post请求 1. 创建一个简单的请求,没有写方法时默认为get from flask import Flask, request# 初始化一个flask的对象 ap…

RK3566 linux iperf网络测试

一、开发环境 系统:buildroot&#xff1b; 在Linux目标板和Windows PC上运行iperf进行测试&#xff1b; 二、调试 1、查询目标板上的iperf 使用终端助手连接目标板&#xff0c;然后输入命令查询iperf的版本&#xff1a; rootrk3566-buildroot:~# iperf -v iperf version …