相同的樹及延伸題型(C語言詳解版)

從LeetCode 100和101看二叉樹的比較與對稱性判斷

今天要講的是leetcode100.相同的樹,并且本文章還會講到延伸題型leetcode101.對稱二叉樹。本文章編寫用的是C語言,大家主要是學習思路,學習過后可以自己點擊鏈接測試,并且做一些對應的生題,現在就讓我們開始吧!

一、題目簡介

LeetCode 100:相同的樹

給你兩棵二叉樹的根節點?p?和?q?,編寫一個函數來檢驗這兩棵樹是否相同。

如果兩個樹在結構上相同,并且節點具有相同的值,則認為它們是相同的。

示例 1:

輸入:p = [1,2,3], q = [1,2,3]
輸出:true

示例 2:

輸入:p = [1,2], q = [1,null,2]
輸出:false

示例 3:

輸入:p = [1,2,1], q = [1,1,2]
輸出:false

提示:

  • 兩棵樹上的節點數目都在范圍?[0, 100]?內
  • -104 <= Node.val <= 104

LeetCode 101:? ?對稱二叉樹

給你一個二叉樹的根節點?root?, 檢查它是否軸對稱。

示例 1:

輸入:root = [1,2,2,3,4,4,3]
輸出:true

示例 2:

輸入:root = [1,2,2,null,3,null,3]
輸出:false

提示:

  • 樹中節點數目在范圍?[1, 1000]?內
  • -100 <= Node.val <= 100

進階:你可以運用遞歸和迭代兩種方法解決這個問題嗎?

二、思路詳解

題目一:LeetCode 100(相同的樹)

1. 問題分析

這道題里有一個小坑,如果我們單純只通過遍歷來比對是否相等的話,是無法保證二叉樹的結構相同的,僅僅只能保證該顆二叉樹所包含的節點數值是一致的,但是我們將一顆樹分為多個部分來比對就會方便很多,將兩棵樹對應的左子樹與左子樹比對,右子樹和右子樹比對。

2. 解題思路

我們可以使用遞歸的方法來解決這個問題。遞歸的基本思路如下:

  • 如果兩個節點都為空,返回 true

  • 如果一個節點為空而另一個不為空,返回 false

  • 如果兩個節點的值不同,返回 false

  • 遞歸地比較左子樹和右子樹。

3. C語言實現
#include <stdbool.h>// 定義二叉樹節點結構
typedef struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
} TreeNode;// 遞歸函數,比較兩個節點
bool isSameTree(TreeNode* p, TreeNode* q) {// 如果兩個節點都為空,返回trueif (p == NULL && q == NULL) {return true;}// 如果一個為空,另一個不為空,返回falseif (p == NULL || q == NULL) {return false;}// 如果兩個節點的值不同,返回falseif (p->val != q->val) {return false;}// 遞歸比較左子樹和右子樹return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

題目二:LeetCode 101(對稱二叉樹)

1. 問題分析

這道題與上一道題(LeetCode 100:相同的樹)是很相似,但有兩個關鍵的不同點:

  1. 參數不同:這道題只傳入一個根節點,即只有一棵樹。

  2. 判斷條件不同:這道題要求判斷的是對稱二叉樹,即鏡像相同。具體來說,左子樹的左節點應該與右子樹的右節點相同,左子樹的右節點應該與右子樹的左節點相同。

2. 解題思路

為了解決上述兩個不同點,我們可以通過構造一個新的函數來實現將一棵樹“一分為二”,再對兩側的左右子樹進行比較。遞歸的基本思路如下:

  1. 遞歸終止條件

    • 如果兩個節點都為空,返回 true,表示這部分是鏡像對稱的。

    • 如果一個節點為空而另一個不為空,返回 false,表示這部分不對稱。

  2. 遞歸邏輯

    • 如果兩個節點的值相同,繼續遞歸比較左子樹的左節點與右子樹的右節點,以及左子樹的右節點與右子樹的左節點。

    • 如果兩個節點的值不同,直接返回 false

3. C語言實現
#include <stdbool.h>// 定義二叉樹節點結構
typedef struct TreeNode {int val;                     // 節點的值struct TreeNode *left;       // 指向左子節點的指針struct TreeNode *right;      // 指向右子節點的指針
} TreeNode;// 輔助函數:檢查兩個節點是否鏡像對稱
bool check(struct TreeNode* p, struct TreeNode* q) {// 如果兩個節點都為空,說明這部分是鏡像對稱的if (p == NULL && q == NULL) {return true;}// 如果一個為空,另一個不為空,說明這部分不對稱if (p == NULL || q == NULL) {return false;}// 如果兩個節點的值相同,繼續遞歸檢查子節點if (p->val == q->val) {// 遞歸檢查左子樹的左節點與右子樹的右節點// 以及左子樹的右節點與右子樹的左節點return check(p->left, q->right) && check(p->right, q->left);}// 如果兩個節點的值不同,直接返回falsereturn false;
}// 主函數:判斷整棵樹是否對稱
bool isSymmetric(struct TreeNode* root) {// 從根節點開始,調用輔助函數檢查整棵樹是否對稱return check(root, root);
}
4.迭代法(拓展)

為了判斷一棵二叉樹是否對稱,我們還可以使用層次遍歷(BFS)。由于二叉樹的結構特性,我們無法直接通過自身的遍歷來實現層次遍歷,因此需要借助一個輔助數據結構——隊列。隊列可以幫助我們逐層比較左右子樹的節點,確保對稱性。

#include <stdbool.h>// 定義二叉樹節點結構
typedef struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
} TreeNode;// 使用迭代方法(層次遍歷)判斷二叉樹是否對稱
bool isSymmetric(struct TreeNode* root) {// 如果根節點為空,直接返回 true(空樹是對稱的)if (root == NULL) return true;// 使用數組模擬隊列struct TreeNode* queue[1000];// head 和 tail 分別指向隊列的頭部和尾部int head = 0, tail = 0;// 將根節點的左右子樹加入隊列queue[tail++] = root->left;queue[tail++] = root->right;// 循環結束條件:隊列為空(head == tail)while (head != tail) {// 從隊列中取出兩個節點進行比較struct TreeNode* leftNode = queue[head++];struct TreeNode* rightNode = queue[head++];// 如果一個節點為空而另一個不為空,說明不對稱,返回 falseif (leftNode == NULL && rightNode != NULL) return false;if (leftNode != NULL && rightNode == NULL) return false;// 如果兩個節點都為空,跳過本輪循環,繼續下一對節點的比較if (leftNode == NULL && rightNode == NULL) continue;// 如果兩個節點的值不相等,說明不對稱,返回 falseif (leftNode->val != rightNode->val) return false;// 將左節點的左子節點和右節點的右子節點加入隊列queue[tail++] = leftNode->left;queue[tail++] = rightNode->right;// 將左節點的右子節點和右節點的左子節點加入隊列queue[tail++] = leftNode->right;queue[tail++] = rightNode->left;}// 如果隊列為空且沒有發現不對稱的情況,返回 truereturn true;
}

好啦,今天的leetcode每日一題就到這里啦,歡迎大家點贊收藏,一起進步,我們明天見!

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

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

相關文章

Carla-ModuleNotFoundError: No module named ‘agents.navigation‘

解決辦法&#xff1a; You need to make sure that _agents _ is in your (PYTHON)PATH variable or your working dictionary. Setting your working dictionary to <CARLA_ROOT>/PythonAPI/carla would fix it as agents is a sub dictionary. Similarly adding the c…

【Rust自學】15.0. 智能指針(序):什么是智能指針及Rust智能指針的特性

喜歡的話別忘了點贊、收藏加關注哦&#xff0c;對接下來的教程有興趣的可以關注專欄。謝謝喵&#xff01;(&#xff65;ω&#xff65;) 15.0.1 指針的基本概念 指針是一個變量在內存中包含的是一個地址&#xff0c;指向另一個數據。 Rust 中最常見的指針是引用&#xff0c…

數據結構:線性表查找的三種方式

只要是靜態查找表即可 #define ElemType int typedef struct { ElemType *d; int length; }SSTable; 順序查找 S(n)O(1) 哨兵空間 int Search_Seq(SSTable t,ElemType key) {t.d[0]key;for (int i t.length; i >0 ; i--) {if(t.d[i]t.d[0]){return i;}}return 0; } 折半查找…

記錄一次,PyQT的報錯,多線程Udp失效,使用工具如netstat來檢查端口使用情況。

1.問題 報錯Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…

電路研究9.2.5——合宙Air780EP中GPS 相關命令使用方法研究

注&#xff1a;本命令僅適用于合宙 4G CAT1 模塊&#xff08;Air780EG 系列&#xff09;。 正好&#xff0c;我們使用的Air780EP好像也有4G CAT1模塊&#xff0c;好像也屬于Air780EG系列吧。 這個例子好像比較少就個。 18.9 使用方法舉例 18.1GPS 開關&#xff1a;ATCGNSPWR 這…

【C語言】在Windows上為可執行文件.exe添加自定義圖標

本文詳細介紹了在 Windows 環境下,如何為使用 GCC 編譯器編譯的 C程序 添加自定義圖標,從而生成帶有圖標的 .exe 可執行文件。通過本文的指導,讀者可以了解到所需的條件以及具體的操作步驟,使生成的程序更具專業性和個性化。 目錄 1. 準備條件2. 具體步驟步驟 1: 準備資源文…

python編程環境安裝保姆級教程--python-3.7.2pycharm2021.2.3社區版

第1步安裝解釋器python-3.7.2&#xff0c;第2步安裝pycharm編程軟件 1、安裝解釋器 1.1 什么是解釋器 就是將Python高級程序語言翻譯成為計算機可以識別的0、1代碼 1.2 安裝解釋器python-3.7.2&#xff08;根據自己的操作系統安裝適配的解釋器&#xff0c;以Windows為例&…

STM32 TIM輸入捕獲 測量頻率

輸入捕獲簡介&#xff1a; IC&#xff08;Input Capture&#xff09;輸入捕獲 輸入捕獲模式下&#xff0c;當通道輸入引腳出現指定電平跳變時&#xff0c;當前CNT的值將被鎖存到CCR中&#xff0c;可用于測量PWM波形的頻率、占空比、脈沖間隔、電平持續時間等參數 每個高級定時器…

21.3-啟動流程、編碼風格(了解) 第21章-FreeRTOS項目實戰--基礎知識之新建任務、啟動流程、編碼風格、系統配置 文件組成和編碼風格(了解)

21.3-啟動流程、編碼風格(了解) 啟動流程 第一種啟動流程(我們就使用這個): 在main函數中將硬件初始化、RTOS系統初始化&#xff0c;同時創建所有任務&#xff0c;再啟動RTOS調度器。 第二種啟動流程&#xff1a; 在main函數中將硬件初始化、RTOS系統初始化&#xff0c;只…

【AI非常道】二零二五年一月(二),AI非常道

經常在社區看到一些非常有啟發或者有收獲的話語&#xff0c;但是&#xff0c;往往看過就成為過眼云煙&#xff0c;有時再想去找又找不到。索性&#xff0c;今年開始&#xff0c;看到好的言語&#xff0c;就記錄下來&#xff0c;一月一發布&#xff0c;亦供大家參考。 有關AI非…

Mac Electron 應用簽名(signature)和公證(notarization)

在MacOS 10.14.5之后&#xff0c;如果應用沒有在蘋果官方平臺進行公證notarization(我們可以理解為安裝包需要審核&#xff0c;來判斷是否存在病毒)&#xff0c;那么就不能被安裝。當然現在很多人的解決方案都是使用sudo spctl --master-disable&#xff0c;取消驗證模式&#…

1、開始簡單使用rag

文章目錄 前言數據存放申請api開始代碼安裝依賴從文件夾中讀取文檔文檔切塊將分割嵌入并存儲在向量庫中檢索部分代碼構造用戶接口演示提示 整體代碼 前言 本章只是簡單使用rag的一個示例&#xff0c;為了引出以后的學習&#xff0c;將整個rag的流程串起來 數據存放 一個示例…

C 標準庫 - `<errno.h>`

C 標準庫 - <errno.h> 引言 在C語言編程中,正確處理錯誤是保證程序穩定性和可靠性的關鍵。C標準庫中的<errno.h>頭文件提供了錯誤碼定義和宏,使得開發者能夠更好地管理和處理程序運行過程中可能出現的錯誤。本文將詳細介紹<errno.h>頭文件的作用、常用錯…

愛書愛考平臺說明

最近我開發了一個綜合性的考試平臺&#xff0c;內容包括但不限于職業資格證考試、成人教育、國家公務員考試等內容。目前1.0版本已經開發完成&#xff0c;其他的功能陸續完善中。 微信小程序搜索"愛書愛考" 微信小程序圖標如下圖: 目前維護了java相關的面試題的考題…

ZZNUOJ(C/C++)基礎練習1011——1020(詳解版)

目錄 1011 : 圓柱體表面積 C語言版 C版 1012 : 求絕對值 C語言版 C版 1013 : 求兩點間距離 C語言版 C版 1014 : 求三角形的面積 C語言版 C版 1015 : 二次方程的實根 C語言版 C版 1016 : 銀行利率 C語言版 C版 1017 : 表面積和體積 C語言版 C版 代碼邏輯…

Java面試題2025-設計模式

1.說一下開發中需要遵守的設計原則&#xff1f; 設計模式中主要有六大設計原則&#xff0c;簡稱為SOLID &#xff0c;是由于各個原則的首字母簡稱合并的來(兩個L算一個,solid 穩定的)&#xff0c;六大設計原則分別如下&#xff1a; 1、單一職責原則 單一職責原則的定義描述非…

認識小程序的基本組成結構

1.基本組成結構 2.頁面的組成部分 3.json配置文件 4.app.json文件(全局配置文件&#xff09; 5.project.config.json文件 6.sitemap.json文件 7.頁面的.json配置文件 通過window節點可以控制小程序的外觀

git中有關old mode 100644、new mode 10075的問題解決小結

在 Git 版本控制系統中&#xff0c;文件權限變更是一種常見情況。當你看到類似 old mode 100644 和 new mode 100755 的信息時&#xff0c;這通常表示文件的權限發生了變化。本文將詳細解析這種情況&#xff0c;并提供解決方法和注意事項。 問題背景 在 Git 中&#xff0c;文…

20個整流電路及仿真實驗匯總

0、 前言 以下是關于“20個整流電路及仿真實驗匯總”的前言部分: 在現代電力電子技術領域,整流電路作為將交流電(AC)轉換為直流電(DC)的關鍵電路,廣泛應用于各類電源設計、信號處理以及電力電子設備中。整流電路不僅能夠為電子設備提供穩定的直流電源,還在電力傳輸、…

截取窗口的完整矩形不包括陰影區域(含邊框和標題欄)

在Windows編程中&#xff0c;GetWindowRect 函數用于獲取窗口的矩形區域&#xff0c;包括窗口的邊框和標題欄。如果你希望獲取窗口的客戶區&#xff08;不包含窗口邊框、標題欄和陰影區域&#xff09;&#xff0c;可以使用 GetClientRect 函數。 區別 GetWindowRect&#xff1…