力扣做題記錄 (二叉樹)

二叉樹

打算先來了解二叉樹基礎,都是簡單題,目的是熟悉代碼格式和解題基礎思路。

1、二叉樹最大深度

二叉樹最大深度
在這里插入圖片描述

方法一、深度搜索

直接用原函數做遞歸,比較簡單

/*** 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:int maxDepth(TreeNode* root) {if(root ==nullptr)return 0;return max(maxDepth(root->left), maxDepth(root->right))+1;}
};

方法二、廣度搜索

  • 利用queue來存儲每一層的節點
  • 每層次循環是當前queue的長度,用一個數來記錄,一般是2的次方,然后再將新的數放置queue末尾。
class Solution {
public:int maxDepth(TreeNode* root) {if(root==nullptr)return 0;queue<TreeNode*> Q;Q.push(root);int depth = 0;while(!Q.empty()){int sz=Q.size();while(sz>0){TreeNode* node= Q.front();Q.pop();if(node->left)Q.push(node->left);if(node->right)Q.push(node->right);sz-=1;}depth+=1;}return depth;}
};

2、相同的樹

相同的樹

在這里插入圖片描述

方法一、前序遍歷比較

這是自己寫的,思路是確定可以用遞歸,這個是深度搜索
然后先判斷節點存在,再判斷是否正確

/*** 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 isSameTree(TreeNode* p, TreeNode* q) {bool a=true,b=true;if(p==nullptr&&q==nullptr)return true;else if(p!=nullptr&&q==nullptr)return false;else if(p==nullptr&&q!=nullptr)return false;else{if(p->val!=q->val)return false;a=isSameTree(p->left,q->left);b=isSameTree(p->right,q->right);}if(a==false||b==false)return false;else return true;}
};

方法二、廣度搜索

來自官方題解中的一種有點復雜。

class Solution {  
public:  // 檢查兩棵二叉樹是否相同  bool isSameTree(TreeNode* p, TreeNode* q) {  // 如果兩棵樹都為空,返回 true  if (p == nullptr && q == nullptr) {  return true;  }   // 如果一棵樹為空而另一棵樹不為空,返回 false  else if (p == nullptr || q == nullptr) {  return false;  }  // 創建兩個隊列用于廣度優先搜索(BFS)  queue<TreeNode*> queue1, queue2;  queue1.push(p); // 將第一個樹的根節點入隊  queue2.push(q); // 將第二個樹的根節點入隊  // 當兩個隊列都不為空時,繼續比較  while (!queue1.empty() && !queue2.empty()) {  // 取出兩個隊列的前端節點進行比較  auto node1 = queue1.front();  queue1.pop();  auto node2 = queue2.front();  queue2.pop();  // 比較兩個節點的值  if (node1->val != node2->val) {  return false; // 值不相同,則樹不相同  }  // 獲取當前節點的左右子節點  auto left1 = node1->left, right1 = node1->right;  auto left2 = node2->left, right2 = node2->right;  // 檢查左右子節點是否存在不一致  if ((left1 == nullptr) ^ (left2 == nullptr)) {  return false; // 只有一棵樹有左子節點  }  if ((right1 == nullptr) ^ (right2 == nullptr)) {  return false; // 只有一棵樹有右子節點  }  // 如果左右子節點存在,則將其加入隊列中  if (left1 != nullptr) {  queue1.push(left1); // 將第一個樹的左子節點添加到隊列  }  if (right1 != nullptr) {  queue1.push(right1); // 將第一個樹的右子節點添加到隊列  }  if (left2 != nullptr) {  queue2.push(left2); // 將第二個樹的左子節點添加到隊列  }  if (right2 != nullptr) {  queue2.push(right2); // 將第二個樹的右子節點添加到隊列  }  }  // 返回兩個隊列是否都為空(即兩棵樹的結構是否相同)  return queue1.empty() && queue2.empty();  }  
};

3、翻轉二叉樹

翻轉二叉樹

在這里插入圖片描述

方法一、

用遞歸找到最下方的左右子樹,直接更換節點而不是值

/*** 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:TreeNode* invertTree(TreeNode* root) {if(root==nullptr){return nullptr;}TreeNode *left=invertTree(root->left);TreeNode *right=invertTree(root->right);root->left=right;root->right=left;return root;}
};

4、對稱二叉樹

101.對稱二叉樹
在這里插入圖片描述

方法一、廣度匹配

也就是迭代求解,下面是我自己寫的復雜的代碼,因為本能覺得可以把每一層,存儲為一個vector,然后再綜合比較。但是實現起來略顯復雜

/*** 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 isSymmetric(TreeNode* root) {queue<TreeNode*> tree_level;vector<int> num_level;vector<int> num_level_re;int level=1;if(root->left==nullptr&&root->right==nullptr)return true;else if(root->left!=nullptr&&root->right!=nullptr){level=1;}else return false;tree_level.push(root->left);num_level.push_back(root->left->val);tree_level.push(root->right);num_level.push_back(root->right->val);while(tree_level.size()!=0){num_level_re=num_level;reverse(num_level_re.begin(),num_level_re.end());for(int i=0;i<num_level.size();i++){if(num_level[i]==num_level_re[i])continue;else return false;}num_level.clear();num_level_re.clear();// 把每層都節點和元素加入int level1 = tree_level.size();while(level1>0){TreeNode* root_now;root_now = tree_level.front();tree_level.pop();if(root_now->left!=nullptr){tree_level.push(root_now->left);num_level.push_back(root_now->left->val);}else num_level.push_back(-1);if(root_now->right!=nullptr){tree_level.push(root_now->right);num_level.push_back(root_now->right->val);}else num_level.push_back(-1);level1--;}// 判斷每層不能為奇數if(tree_level.size()%2!=0)return false;  level++;}return true;}
};

方法二、精簡迭代法

其思路是:特地寫一個輔助函數,可以同時輸入左右子樹,這樣更加方便做迭代

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);}
};

方法三、遞歸法

比較難想到,下面是解釋
也需要輔助函數, 然后最左的和最右的分別組成對對比

class Solution {
public:// 輔助函數:檢查兩個子樹是否對稱bool check(TreeNode *leftNode, TreeNode *rightNode) {// 情況 1:兩個節點都為空if (leftNode == nullptr && rightNode == nullptr) {return true; // 空節點是對稱的}// 情況 2:其中一個節點為空,另一個不為空if (leftNode == nullptr || rightNode == nullptr) {return false; // 不對稱}// 情況 3:兩個節點的值不相等if (leftNode->val != rightNode->val) {return false; // 不對稱}// 遞歸檢查:// 1. 左子樹的左節點和右子樹的右節點是否對稱// 2. 左子樹的右節點和右子樹的左節點是否對稱bool isOuterSymetric = check(leftNode->left, rightNode->right);  // 檢查外層bool isInnerSymetric = check(leftNode->right, rightNode->left); // 檢查內層// 只有外層和內層都對稱,整個樹才對稱return isOuterSymetric && isInnerSymetric;}// 主函數:判斷二叉樹是否對稱bool isSymmetric(TreeNode* root) {// 如果根節點為空,直接返回 true(空樹是對稱的)if (root == nullptr) {return true;}// 檢查左子樹和右子樹是否對稱return check(root->left, root->right);}
};

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

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

相關文章

如何下載Qt和運行第一個程序。

Ubuntu24.04 下載比較容易&#xff0c;基本都是無腦操作。途中匯出現有個別package下載不成功的情況&#xff0c;重新下載即可。 文章目錄 下載qt運行qt第一個項目 下載qt 1.先找到官網&#xff0c;點擊Download。 2.然后選擇&#xff0c;community User 3.然后會跳轉到這個…

HCIA項目實踐--靜態路由的拓展配置

7.7 靜態路由的拓展配置 網絡中的兩個重要思想&#xff1a; &#xff08;1&#xff09; 實的不行來虛的&#xff1b; &#xff08;2&#xff09; 范圍太大&#xff0c;劃分范圍。&#xff08;分治&#xff09; 7.7.1 負載均衡 &#xff08;1&#xff09;定義 負載均衡是一種網…

Base64 PDF解析器

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Base64 PDF解析器</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 20px auto;padding: 20px;}.contain…

基于51單片機的的雞籠補光和恒溫系統的設計與實現(源程序+Protues仿真+電路圖+元件清單+器件手冊)

編號&#xff1a;71 基于51單片機的的雞籠補光和恒溫系統的設計與實現 功能描述&#xff1a; 本設計由89C52單片機液晶12864顯示模塊聲光報警電路溫濕度傳感器電路風扇電路LED照明電路光照檢測電路GSM電路DS1302時鐘電路 1.實現的功能 (1)采用DHT11溫濕傳感器、光敏電阻捕捉…

Spring——Spring開發實戰經驗(1)

摘要 文章主要介紹了 Swagger 作為 API 文檔生成和測試工具的功能&#xff0c;包括自動生成 API 文檔、提供可視化調試界面、促進前后端協作、支持 OpenAPI 規范等。同時&#xff0c;還提及了 Spring Boot 與 Swagger3 的實戰應用&#xff0c;以及 Spring 開發中其他相關技術內…

SAP-ABAP:SAP的Screen Layout Designer屏幕布局設計器詳解及示例

在SAP中&#xff0c;Screen Layout Designer&#xff08;屏幕布局設計器&#xff09;是用于設計和維護屏幕&#xff08;Dynpro&#xff09;布局的工具。通過Screen Layout Designer&#xff0c;您可以創建和修改屏幕元素&#xff08;如輸入字段、按鈕、文本、表格控件等&#x…

安全筑基,智能賦能:BeeWorks IM引領企業協同新紀元

在數字經濟高速發展的今天&#xff0c;企業通訊系統已從單純的信息傳遞工具演變為支撐業務創新的核心平臺。傳統通訊工具在安全性、智能化、協同性等方面的不足&#xff0c;嚴重制約著企業的數字化轉型進程。BeeWorks IM系統以其創新的技術架構和智能化功能&#xff0c;正在重新…

SpringBoot實戰:高效獲取視頻資源

文章目錄 前言技術實現SpringBoot項目構建產品選取配置數據采集 號外號外 前言 在短視頻行業高速發展的背景下&#xff0c;海量內容數據日益增長&#xff0c;每天都有新的視頻、評論、點贊、分享等數據涌現。如何高效、精準地獲取并處理這些龐大的數據&#xff0c;已成為各大平…

【IoTDB 線上小課 11】為什么 DeepSeek 要選擇開源?

新年新氣象&#xff0c;【IoTDB 視頻小課】第十一期全新來臨&#xff01; 關于 IoTDB&#xff0c;關于物聯網&#xff0c;關于時序數據庫&#xff0c;關于開源... 一個問題重點&#xff0c;3-5 分鐘&#xff0c;我們講給你聽&#xff1a; 開源“加成”再次展現&#xff01; 現在…

宏任務和微任務

在前端開發中&#xff0c;**宏任務&#xff08;Macro Task&#xff09;**和**微任務&#xff08;Micro Task&#xff09;**是 JavaScript 事件循環&#xff08;Event Loop&#xff09;中的兩個重要概念。它們決定了異步代碼的執行順序。 --- ### 1. **事件循環&#xff08;Ev…

人工智能 - 機器學習、深度學習、強化學習是人工智能領域的理論基礎和方法論

機器學習、深度學習、強化學習是人工智能領域的三大核心方向,各自具有獨特的理論基礎和方法論。以下是它們的核心理論知識總結: 一、機器學習(Machine Learning, ML) 1. 基礎概念 目標:通過數據驅動的方式,讓機器從經驗中學習規律,完成預測、分類或決策任務。 核心范式…

java處理pgsql的text[]類型數據問題

背景 公司要求使用磐維數據庫&#xff0c;于是去了解了這個是基于PostgreSQL構建的&#xff0c;在使用時有場景一條圖片數據中可以投放到不同的頁面&#xff0c;由于簡化設計就放在數組中&#xff0c;于是使用了text[]類型存儲&#xff1b;表結構 #這是一個簡化版表結構&…

. Unable to find a @SpringBootConfiguration(默認軟件包中的 Spring Boot 應用程序)

解決&#xff1a; 新建一個包即可 問題&#xff1a; 默認軟件包中的 Spring Boot 應用程序。 原因&#xff1a; 默認包的定義 &#xff1a; 如果一個 Java 類沒有使用 package 聲明包名&#xff0c;則該類會被放置在默認包中。Spring Boot 遵循 Java 的包管理約定&#xff…

C語言——排序(冒泡,選擇,插入)

基本概念 排序是對數據進行處理的常見操作&#xff0c;即將數據按某字段規律排列。字段是數據節點的一個屬性&#xff0c;比如學生信息中的學號、分數等&#xff0c;可針對這些字段進行排序。同時&#xff0c;排序算法有穩定性之分&#xff0c;若兩個待排序字段一致的數據在排序…

滲透利器:YAKIT 工具-基礎實戰教程.

YAKIT 工具-基礎實戰教程. YAKIT&#xff08;Yak Integrated Toolkit&#xff09;是一款基于Yak語言開發的集成化網絡安全單兵工具&#xff0c;旨在覆蓋滲透測試全流程&#xff0c;提供從信息收集、漏洞掃描到攻擊實施的自動化支持。其核心目標是通過GUI界面降低Yak語言的使用…

CRISPR spacers數據庫;CRT和PILER-CR用于MAGs的spacers搜索

iPHoP&#xff1a;病毒宿主預測-CSDN博客 之前介紹了這個方法來預測病毒宿主&#xff0c;今天來介紹另一種比較用的多的方法CRISPR比對 CRISPR spacers數據庫 Dash 在這可以下載作者搜集的spacers用于后期比對 CRT和PILER-CR 使用 CRT 和 PILERCR 識別 CRISPR 間隔區&#x…

模糊聚類分析方法:從模糊等價矩陣到動態分類

一、模糊聚類分析的核心思想 在實際工程技術和經濟管理問題中&#xff0c;我們常常需要對對象進行分類。例如&#xff0c;根據生物特征對物種分類、根據氣候特征對城市分類、根據用戶行為對客戶群體分類等。傳統的聚類分析基于清晰的分類邊界&#xff0c;但現實中許多分類問題…

DeepSeek從入門到精通:提示詞設計的系統化指南

目錄 引言&#xff1a;AIGC時代的核心競爭力 第一部分 基礎篇&#xff1a;提示詞的本質與核心結構 1.1 什么是提示詞&#xff1f; 1.2 提示詞的黃金三角結構 第二部分 類型篇&#xff1a;提示詞的六大范式 2.1 提示語的本質特征 2.2 提示語的類型 2.2.1 指令型提示詞 …

【EDA學習】嘉立創題庫

一、多選題 1.嘉立創題庫的作用是什么&#xff0c;以下描述正確的是&#xff1f; A.提供學習平臺&#xff0c;幫助客戶了解嘉立創工藝 B.可成為嘉立創客戶所在企業的內部培訓資料&#xff0c;打通設計與制造&#xff0c;提高產品研發效率&#xff0c;降本增效 C.可成為嘉立創客…

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 創建API key 首先進入DeepSeek官網&#xff0c;https://www.deepseek.com/ 點擊左側“API Keys”&#xff0c;創建API key&#xff0c;輸出名稱為“AI” 點擊“創建"&#xff0c;將API key保存&#xff0c;復制在其它地方。 在PyCharm中下…