【面試經典150 | 二叉樹】對稱二叉樹

文章目錄

  • 寫在前面
  • Tag
  • 題目來源
  • 解題思路
    • 方法一:遞歸
    • 方法二:迭代
  • 寫在最后

寫在前面

本專欄專注于分析與講解【面試經典150】算法,兩到三天更新一篇文章,歡迎催更……

專欄內容以分析題目為主,并附帶一些對于本題涉及到的數據結構等內容進行回顧與總結,文章結構大致如下,部分內容會有增刪:

  • Tag:介紹本題牽涉到的知識點、數據結構;
  • 題目來源:貼上題目的鏈接,方便大家查找題目并完成練習;
  • 題目解讀:復述題目(確保自己真的理解題目意思),并強調一些題目重點信息;
  • 解題思路:介紹一些解題思路,每種解題思路包括思路講解、實現代碼以及復雜度分析;
  • 知識回憶:針對今天介紹的題目中的重點內容、數據結構進行回顧總結。

Tag

【遞歸】【迭代】【二叉樹】


題目來源

101. 對稱二叉樹


解題思路

如果一棵樹的左子樹與右子樹鏡像對稱,那么這兩棵樹是對稱的。

因此,問題轉換為:兩棵樹在什么情況下是互為鏡像的,找出使兩棵樹互為鏡像的條件,根據條件即可結局對稱問題。

鏡像條件如下:

  • 兩棵樹的兩個根節點具有相同的值;
  • 每棵樹的右子樹都要與另一棵樹的左子樹鏡像對稱。

同時滿足以上兩個條件即可判斷出兩棵樹是對稱的。

二叉樹問題通常都有兩種遞歸和迭代的解法。

方法一:遞歸

遞歸出口是什么?

遞歸出口即可以直接判斷的情況,包括:

  • 兩個節點都為空時,直接返回 true
  • 一個節點為空,另一個不為空,返回 false

如何往下遞?

當前的兩個節點表示的子樹是否是對稱的,取決于當前兩節點的值以及左右子樹是否對稱。

只有當前兩節點的值相等并且左右子樹對稱,這兩個節點表示的子樹才是對稱的。

算法

實現一個判斷兩個節點 pq 表示的子樹是否是對稱的函數 check:

  • 如果 p = nullptr 并且 q = nullptr,直接返回 true
  • 如果 p ≠ nullptr 或者 q ≠ nullptr,直接返回 false
  • 最后 pq 表示的子樹是否是對稱與 p->val == q->val && check(p->left, q->right) && check(p->right, q->left) 一致,直接返回該表達式。

調用 check(root, root) 即得到最終答案。

復雜度分析

時間復雜度: O ( n ) O(n) O(n) n n n 為二叉樹中節點的數量。

空間復雜度: O ( n ) O(n) O(n)

方法二:迭代

思路與算法

使用迭代解法需要用到隊列。

首先我們引入一個隊列,初始化時我們把根節點入隊兩次。每次提取兩個節點并比較它們的值(隊列中每兩個連續的節點應該是相等的,而且它們的子樹互為鏡像),然后將兩個節點的左右子節點按相反的順序插入隊列中。

當隊列為空時,或者我們檢測到樹不對稱,即從隊列中取出兩個不相等的連續節點時,該算法結束。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool check(TreeNode* u, TreeNode *v) {queue<TreeNode*> q;q.push(u); q.push(v);while (!q.empty()) {u = q.front(); q.pop();v = q.front(); q.pop();if (!u && !v)continue;if (!u || !v ||(u->val != v->val))return false;q.push(u->left);q.push(v->right);q.push(u->right);q.push(v->left);}return true;}bool isSymmetric(TreeNode* root) {return check(root, root);}
};

復雜度分析

時間復雜度: O ( n ) O(n) O(n) n n n 為二叉樹中節點的數量。

空間復雜度: O ( n ) O(n) O(n),因為二叉樹中的節點最多入隊、出隊一次,因此漸進的時間復雜度為 O ( n ) O(n) O(n)


寫在最后

如果文章內容有任何錯誤或者您對文章有任何疑問,歡迎私信博主或者在評論區指出 💬💬💬。

如果大家有更優的時間、空間復雜度方法,歡迎評論區交流。

最后,感謝您的閱讀,如果感到有所收獲的話可以給博主點一個 👍 哦。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208187.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第6講、Hyper-V體系結構和相關管理程序文件及服務:

1、Hyper-V的體系結構 1、CPU能力在服務器虛擬化實現中扮演著一個重要角色&#xff0c;Intel/AMD型號的CPU定義了一些權限 級別&#xff0c;稱為ring。在傳統模型中&#xff0c;ring0級別最高權限最大。Windows內核和設備驅動程序 使用這個級別…

【優選算法系列】【專題一雙指針】第三節.611. 有效三角形的個數和LCR 179. 查找總價格為目標值的兩個商品

文章目錄 前言一、有效三角形的個數 1.1 題目描述 1.2 題目解析 1.2.1 算法原理 1.2.2 代碼編寫 1.2.3 題目總結二、查找總價格為目標值的兩個商品 2.1 題目描述 2.2 題目解析 2.2.1 算法原理 …

0008-【PID學習筆記 8 】控制系統的分析方法

寫在前面 前面已經完成了控制系統的性能指標學習&#xff0c;從這節開始繼續學習控制系統的分析方法&#xff0c;本文重點介紹分析方法概述和時域分析法。 一、控制系統的基本分析方法 控制系統的基本分析方法包括&#xff1a; 古典方法&#xff08;經典控制理論&#xff09;…

獨孤思維:賺錢需要獨一無二的支點,而不是技多不壓身的堆料

賺錢需要找到屬于自己獨一無二&#xff0c;且超乎常人的支點&#xff0c;而不應該一味追求大而全&#xff0c;技多不壓身的堆料。 凡是考了一堆證書&#xff0c;以為掌握多項技能&#xff0c;就能賺到錢的都是學生思維。 尤其是很多剛入職場的年輕人&#xff0c;為了職場晉升…

2024山東健博會,濟南健康展,5月中國大健康展,健康管理展

China-DJK山東健博會&#xff1a;5月黃金招商季&#xff0c;攜千家參展商、萬余款產品精彩亮相&#xff1b; DJK 2024第6屆中國&#xff08;濟南&#xff09;國際大健康產業博覽會 The 2024 sixth China (Jinan) International Big Health Industry Expo 時間&#xff1a;2024…

LLaMA-Factory微調ChatGLM3報錯: Segmentation fault (core dumped)

SFT訓練模型的命令 CUDA_VISIBLE_DEVICES0 python src/train_bash.py \--stage sft \--model_name_or_path models/chatglm3-6b \--do_train \--dataset self_cognition \--template chatglm3 \--finetuning_type lora \--lora_target query_key_value \--output_dir output/c…

Docker網絡原理

Docker網絡概述 1.橋接模式介紹 bridge模式是docker的默認網絡模式。 橋接模式是一種用于連接兩個不同網絡段的設備&#xff0c;使它們能夠共享通信的一種方式。 橋接設備工作在OSI模型的第二層&#xff0c;即數據鏈路層&#xff0c;通常基于MAC地址進行幀轉發。 物理層連接…

一個簡單的 postman設置接口關聯讓我措施了大廠的機會

postman設置接口關聯 在實際的接口測試中&#xff0c;后一個接口經常需要用到前一個接口返回的結果&#xff0c; 從而讓后一個接口能正常執行&#xff0c;這個過程的實現稱為關聯。 在postman中實現關聯操作的步驟如下&#xff1a; 1、利用postman獲取上一個接口指定的返回值…

YOLOv8 YoLov8l 模型輸出及水果識別

&#x1f368; 本文為[&#x1f517;365天深度學習訓練營學習記錄博客 &#x1f366; 參考文章&#xff1a;365天深度學習訓練營 &#x1f356; 原作者&#xff1a;[K同學啊 | 接輔導、項目定制] &#x1f680; 文章來源&#xff1a;[K同學的學習圈子](https://www.yuque.com/m…

LeetCode雙指針:有序數組中的單一元素

LeetCode雙指針&#xff1a;有序數組中的單一元素 題目描述 給你一個僅由整數組成的有序數組&#xff0c;其中每個元素都會出現兩次&#xff0c;唯有一個數只會出現一次。 請你找出并返回只出現一次的那個數。 你設計的解決方案必須滿足 O(log n) 時間復雜度和 O(1) 空間復…

關于什么是 JVM

關于什么是 JVM&#xff0c;看看普通?和??的回答。 普通人 JVM 就是 Java 虛擬機&#xff0c;是?來運?我們平時所寫的 Java 代碼的。優點是它會 ?動進?內存管理和垃圾回收&#xff0c;缺點是?旦發?問題&#xff0c;要是不了解 JVM 的運? 機制&#xff0c; 就很難…

是誰還沒玩AI擴圖?快跟上節奏啦

最近&#xff0c;抖音上的AI擴圖突然火了&#xff0c;看完真的讓人笑掉大牙&#xff5e;&#xff5e;&#xff5e; 這一熱議的話題#AI擴圖#在短視頻平臺抖音上的播放量已經突破7.8億次&#xff0c;而相關的討論也如同星火燎原&#xff0c;迅速點燃了公眾的好奇心。從“用AI擴圖…

中偉視界:皮帶跑偏、異物檢測AI算法除了礦山行業應用,還能在鋼鐵、火電、港口等行業中使用嗎?

隨著工業化的發展&#xff0c;皮帶輸送機已經成為各行業中不可或缺的重要設備&#xff0c;但是在使用過程中&#xff0c;由于各種原因&#xff0c;皮帶常常出現跑偏問題&#xff0c;給生產運營帶來了諸多困擾。不僅僅是礦山行業&#xff0c;鋼鐵、火電、港口等行業也都面臨著皮…

C語言 掃雷游戲

代碼在一個項目里完成&#xff0c;分成三個.c.h文件(game.c,game.h,main.c) 在Clion軟件中通過運行調試。 /大概想法/ 主函數main.c里是大框架(菜單,掃雷棋盤初始化&#xff0c;隨機函數生成雷&#xff0c;玩家掃雷) game.h函數聲明(除main函數和游戲函數外的一些函數聲明) ga…

RepidJson將內容寫入文件

使用 RapidJSON 將內容寫入文件的步驟如下&#xff1a; 創建一個 rapidjson::Document 對象&#xff0c;將需要寫入文件的內容存儲到其中。創建一個 rapidjson::StringBuffer 對象來保存 JSON 字符串。將 rapidjson::Document 對象轉換為 JSON 字符串&#xff0c;并將其放入 r…

日志打印傳值 傳引用 右值引用性能測試

結論 ubuntu x86平臺qnx平臺優化傳值都是比傳引用的差 但是差距很小 測試代碼 #include <cstdint> #include <ctime> #include <string>#ifdef __linux__#define ITERATIONS 10000000 #else#define ITERATIONS 100000 #endiftemplate <typename... AR…

rust高級 異步編程 一 future

文章目錄 Async 編程簡介async/.await 簡單入門 Future 執行器與任務調度Future 特征使用 Waker 來喚醒任務構建一個定時器執行器 Executor構建執行器 完整代碼 Async 編程簡介 OS 線程, 它最簡單&#xff0c;也無需改變任何編程模型(業務/代碼邏輯)&#xff0c;因此非常適合作…

Linux設置root初始密碼

目錄 一、Linux系統中普通用戶和特權用戶&#xff08;root&#xff09; 二、Linux系統中設置root初始密碼 一、Linux系統中普通用戶和特權用戶&#xff08;root&#xff09; windows 系統中有普通用戶和特權用戶&#xff0c;特權用戶是 administer&#xff0c;普通用戶可以…

mybatisplus調用oracle存儲過程

mybatisplus調用oracle存儲過程 創建一個測試的oracle存儲過程 -- 創建攜帶返回值存儲過程 CREATE OR REPLACE PROCEDURE SP_SUM_PROC_2023(number1 IN NUMBER, number2 IN NUMBER, result OUT NUMBER,result2 OUT NUMBER) is BEGIN result : number1 number2; result2 : 99…

微服務01

筆記&#xff1a; day03-微服務01 - 飛書云文檔 (feishu.cn) 數據庫連接不上&#xff1f; 要在虛擬機啟動MySQL容器。docker start mysql 服務治理 服務提供者&#xff1a;暴露服務接口&#xff0c;供其他服務調用 服務消費者&#xff1a;調用其他服務提供的接口 注冊中心&…