【刷題】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.pswp.cn/news/712176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712176.shtml
英文地址,請注明出處:http://en.pswp.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 …