算法力扣刷題記錄 四十二【101. 對稱二叉樹、100.相同的樹、572.另一個樹的子樹】

前言

二叉樹篇,開始對二叉樹操作練習。
記錄 四十二【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

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


二、嘗試實現

思路一

先用遞歸試一下。核心:判斷軸對稱的標準是什么?

遞歸:自己調用自己。暫時沒找到重復的邏輯

  • 判斷left== right?進入到子樹,不正確。
  • 左子樹走左右中,右子樹走右左中。序列相等?但這是對整個樹。進入到子樹,也不對。

思路二

改變用迭代法。用層序遍歷。
獲得層序結果之后,判斷每一層是偶數且reverse之后相等。但對于示例二,不成立,因為空指針被排除。
思路不成立。

總結:雖然知道要找對稱,但是統一判斷對稱的標準不會


三、參考思路

參考思路鏈接

學習內容

  • 軸對稱:根節點的左子樹和右子樹是否可以翻轉相等? ,如何比較?
  • 從講解獲得正確思路:本次遍歷需要根節點的左子樹和根節點的右子樹同時遍歷。一次性遍歷兩個子樹,才能判斷兩邊節點相不相等。
    • 先傳左子樹的left和右子樹的right,此時外側節點判斷相等;
    • 再傳左子樹的right和右子樹的left,此時內側節點判斷相等;
    • 兩者返回之后,同時都為true,說明對稱。
  • 確定遍歷順序:左右中。處理完左孩子,再處理右孩子,把結果返回給中節點。
  • 嘗試實現中思路不足之處:只處理根節點左子樹,發現根節點右子樹的順序和左邊不一樣。用遍歷順序翻轉,或者如何,都得不到統一的邏輯。

遞歸實現

每一個注釋都是思路。

/*** 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 iscompare(TreeNode* left,TreeNode* right){ //兩邊同時遍歷,所以兩個參數。返回是否相等,用bool類型。//確定終止條件if(!left && !right) return true;    //同時為空,可以翻轉else if(!left && right) return false; //一個空,一個不為空。肯定不等else if (!right && left) return false;//一個空,一個不為空。肯定不等else if(left->val != right->val) return false;//都不為空,但是值不等//都不為空,值相等。說明可以繼續進行外側比較、內側比較,不用return。bool outside = iscompare(left->left,right->right);  //同時比較,解決了左右遍歷順序不一樣bool inside = iscompare(left->right,right->left);return outside && inside;   //同時返回true。才能返回true}bool isSymmetric(TreeNode* root) {return iscompare(root->left,root->right);}
};

一個樹(左子樹)的遍歷順序是左右中,一個樹(右子樹)的遍歷順序是右左中。

迭代思路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:bool isSymmetric(TreeNode* root) {if(!root) return false;queue<TreeNode*> que;que.push(root->left);//放入左子樹que.push(root->right);//放入右子樹while(!que.empty()){TreeNode* left = que.front(); que.pop();//取出比較對象中的左節點TreeNode* right = que.front();que.pop();//取出比較對象中的右節點if(!left && !right){    //都是空節點continue;}else if(!left || !right || left->val != right->val){return false;}que.push(left->left);que.push(right->right);que.push(left->right);que.push(right->left);}return true;}
};

總結【軸對稱二叉樹】:

  • 依然是遍歷,不同在于:必須同時遍歷兩個子樹。深入任何一個子樹遞歸都是不對的。
  • 比較對象判斷true的條件:同時空;或值相等。其余都是false。
  • 也不可以深入任何一個子樹遞歸遍歷,因為左邊和右邊順序不一樣。
  • 不是層序遍歷。如果非得層序遍歷:得出每一層結果,reverse之后看是否相等。如下(不推薦),上面的解答都很好。
/*** 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) {vector<vector<int>> level;queue<TreeNode*> que;if(!root) return false;que.push(root);while(!que.empty()){int size = que.size();vector<int> vec;while(size--){TreeNode* cur = que.front();que.pop();if(cur){ //不是空節點que.push(cur->left);que.push(cur->right);vec.push_back(cur->val);}else{vec.push_back(INT_MIN);//因為節點的值【-100,100】。用一個最小值代表空。}}level.push_back(vec);}//獲得層序遍歷。包含空。空的數值借助INT_MIN代替。for(int i = 1;i < level.size();i++){vector<int> temp = level[i];reverse(temp.begin(),temp.end());if(temp != level[i]){return false;}}return true;}
};

題目練習

【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] 內
-10^4 <= Node.val <= 10^4

思路

判斷兩個樹是否相同。結構相同且值相同。

  • 那么必須同時處理兩個樹,才有比較對象。只對一個樹深入遍歷/做什么操作,都是無用的 。
  • 和【101.對稱二叉樹】區別,比較對象。這里比較對象左孩子和左孩子比;右孩子和右孩子比。遞歸調用的參數給對。

代碼實現

/*** 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) {if(!p && !q) return true;  //傳入節點同時為空,可以對應else if(!p && q) return false;//一個空,另一個不是空。不可能對應。else if(p && !q) return false;//一個空,另一個不是空。不可能對應。else if(p->val != q->val) return false;//值不等,不可能對應。bool leftchild = isSameTree(p->left,q->left); bool rightchild = isSameTree(p->right,q->right);return leftchild && rightchild;}
};

【572.另一個樹的子樹】

題目

給你兩棵二叉樹 root 和 subRoot 。檢驗 root 中是否包含和 subRoot 具有相同結構和節點值的子樹。如果存在,返回 true ;否則,返回 false 。

二叉樹 tree 的一棵子樹包括 tree 的某個節點和這個節點的所有后代節點。tree 也可以看做它自身的一棵子樹。

示例 1:

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

示例 2:

輸入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
輸出:false

提示:

root 樹上的節點數量范圍是 [1, 2000]
subRoot 樹上的節點數量范圍是 [1, 1000]
-10^4 <= root.val <= 10^4
-10^4 <= subRoot.val <= 10^4

思路

(1)子樹也是判斷兩個樹相等。可以用【100.題代碼實現】解決相等判斷。
(2)但是得在root中找到等于subRoot根節點值的節點,作為子樹的根節點。用層序遍歷root。

代碼實現

/*** 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 isSame(TreeNode* rootnode,TreeNode* subRootnode){if(!rootnode && !subRootnode) return true;else if(!rootnode && subRootnode) return false;else if(rootnode && !subRootnode) return false;else if(rootnode->val != subRootnode->val) return false;bool leftchild = isSame(rootnode->left,subRootnode->left);bool rightchild = isSame(rootnode->right,subRootnode->right);return leftchild && rightchild;}bool isSubtree(TreeNode* root, TreeNode* subRoot) {//先找到和subRoot值相等的節點,才有可能相等。得遍歷root找到和subRoot值相等的節點,可能作為子樹的根節點//用層序遍歷queue<TreeNode*> que;que.push(root);while(!que.empty()){int size = que.size();while(size--){TreeNode* cur = que.front();que.pop();if(cur->val == subRoot->val){bool subtree = isSame(cur,subRoot);if(subtree) return true;}if(cur->left) que.push(cur->left);if(cur->right) que.push(cur->right);}}return false;}
};

全文總結

核心:同時遍歷兩個樹,確定比較對象。進行遞歸實現。

深入任何一個樹遍歷,都無法產生比較對象的雙方。

(歡迎指正,轉載標明出處)

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

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

相關文章

S5730交換機上配置訪問控制列表(ACL)、OSPF路由和PIM-SM組播

配置訪問控制列表&#xff08;ACL&#xff09; 假設我們創建一個簡單的ACL&#xff0c;允許或拒絕特定流量通過。 進入系統視圖 sys 創建一個標準ACL&#xff0c;允許192.168.1.0/24網段的流量通過 acl number 2001 rule 5 permit source 192.168.1.0 0.0.0.255 其他流量默…

Pytest單元測試系列[v1.0.0][Pytest基礎]

Pytest安裝與配置 和Unittest一樣&#xff0c;Pytest是另一個Python語言的單元測試框架&#xff0c;與Unittest相比它的測試用例更加容易編寫、運行方式更加靈活、報錯信息更加清晰、斷言寫法更簡潔并且它可以運行有unittest和nose編寫的測試用例。 Pytest 安裝 啟動命令行&…

【Pytorch】Conda環境下載慢換源/刪源/恢復默認源

文章目錄 背景臨時換源永久換源打開conda配置condarc換源執行配置 命令行修改源添加源查看源 刪源恢復默認源使用示范 背景 隨著實驗增多&#xff0c;需要分割創建環境的情況時有出現&#xff0c;在此情況下使用conda create --name xx python3.10 pytorch torchvision pytorc…

uni-app三部曲之二: 封裝http請求

1.引言 前面一篇文章寫了使用Pinia進行全局狀態管理。 這篇文章主要介紹一下封裝http請求&#xff0c;發送數據請求到服務端進行數據的獲取。 感謝&#xff1a; 1.yudao-mall-uniapp: 芋道商城&#xff0c;基于 Vue Uniapp 實現&#xff0c;支持分銷、拼團、砍價、秒殺、優…

電腦自動重啟是什么原因呢?99%人都不知道的解決辦法,直接打破循環

當你的電腦突然毫無預警地自動重啟&#xff0c;不僅打斷了工作流程&#xff0c;還可能導致未保存的數據丟失&#xff0c;這無疑是一件令人沮喪的事情。那么&#xff0c;電腦自動重啟是什么原因呢&#xff1f;有什么方法可以解決呢&#xff1f;別擔心&#xff0c;在大多數情況下…

Android Retrofit post請求,@Body傳遞的參數轉義問題

文章目錄 問題解決原因解決方案一&#xff1a;自己拼接json字符串&#xff0c;Body使用RequestBody類型&#xff0c;比如解決方案二&#xff1a;修改Retrofit的Gson 問題 因為傳遞的參數字符串中有等號 &#xff0c;結果傳遞的時候&#xff0c;打印出來 原始字符串&#xff…

【AIGC】GPT-4深度解析:自然語言處理的新紀元

目錄 第一部分&#xff1a;GPT-4技術概覽 1.1 GPT-4模型架構 多模態輸入處理 專家混合&#xff08;MoE&#xff09;技術詳解 參數規模和模型復雜性 1.2 GPT-4的關鍵技術創新 上下文窗口的擴展 模型性能預測技術 1.3 GPT-4與其他模型的比較 性能對比 架構差異 第二部…

docker-2

27.構建python應用鏡像-dockerfile實踐項目 1.基于官方的鏡像&#xff0c;構建python代碼運行環境 dockerfile 2.運行鏡像&#xff0c;開啟一個讀寫的容器空間&#xff08;定制操作&#xff0c;將代碼丟進去&#xff0c;運行調試&#xff09; 3.提交這個變化的容器層數據&#…

cal命令

1、命令詳解&#xff1a; cal&#xff08;全稱&#xff1a;Calendar&#xff09;該命令用來顯示當前日歷或者指定日期的公歷。 2、官方參數&#xff1a; -1, --one 僅顯示當前月份&#xff08;默認&#xff09;-3, --three 顯示上個月、當前月和下個月-s, --sunday…

谷粒商城P85發布商品時規格參數不顯示問題

P85講&#xff0c;發布商品&#xff0c;點擊下一步之后&#xff0c;發現規格參數不顯示 打開控制臺發現報錯forEach...錯誤 查了問題原因&#xff0c;發現返回的分組中個別組的關聯屬性(attrs)可能為null 所以這個時候&#xff0c;需要確保后端返回的attrs不能為null 方式1…

數據結構之順序存儲線性表實現詳解與示例(C,C#,C++)

文章目錄 一、順序存儲線性表的基本概念二、順序存儲線性表的實現1、數據結構定義2、初始化3、添加元素4、訪問元素5、修改元素6、刪除元素7、銷毀 三、示例C語言示例C#語言示例C語言示例 順序存儲線性表是一種基本的數據結構&#xff0c;它將線性表的元素按照一定的順序存放在…

Mysql中存儲過程、存儲函數、自定義函數、變量、流程控制語句、光標/游標、定義條件和處理程序的使用示例

場景 存儲過程 存儲過程是一組為了完成特定功能的SQL語句集合。使用存儲過程的目的是將常用或復雜的工作預先用SQL語句寫好并用一個指定名稱存儲起來&#xff0c; 這個過程經編譯和優化后存儲在數據庫服務器中&#xff0c;因此稱為存儲過程。 當以后需要數據庫提供與己定義…

分享WPF的UI開源庫

文章目錄 前言一、HandyControl二、AduSkin三、Adonis UI四、Panuon.WPF.UI五、LayUI-WPF六、MahApps.Metro七、MaterialDesignInXamlToolkit八、FluentWPF九、DMSkin總結 前言 分享WPF的UI開源庫。 一、HandyControl HandyControl是一套WPF控件庫&#xff0c;它幾乎重寫了所…

uni-app 掃描二維碼獲取信息功能

首先是掃描二維碼的功能&#xff0c;可以參考這篇博文 uni-app-H5頁面調用設備攝像頭掃描二維碼_uni-app app端調用攝像頭顯示至指定元素上顯示-CSDN博客 然后現在是可以掃描二維碼的狀態&#xff0c;掃描之后&#xff0c;可以看到首先是出發上一個頁面的事件&#xff0c;然后…

每天一個數據分析題(四百二十五)- 單因素方差分析

關于下表&#xff0c;錯誤說法是&#xff08; &#xff09; A. 這是單因素方差分析的輸出結果 B. 表中 F< F crit, 與 P-value 大于顯著性水平是等價的 C. 表內組間均方差沒有顯著大于組內均方差 D. 由于組內SS數值顯著大于組間SS&#xff0c;因此可以推斷不同分類對于…

使用Python繪制面積圖

使用Python繪制面積圖 面積圖效果代碼 面積圖 面積圖展示數據隨時間的累積變化&#xff0c;適合表現趨勢和總量。通過填充圖形下方的區域&#xff0c;可以直觀地顯示各時間點的數值及其變化。 效果 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-…

機器學習——決策樹(筆記)

目錄 一、認識決策樹 1. 介紹 2. 決策樹生成過程 二、sklearn中的決策樹 1. tree.DecisionTreeClassifier&#xff08;分類樹&#xff09; &#xff08;1&#xff09;模型基本參數 &#xff08;2&#xff09;模型屬性 &#xff08;3&#xff09;接口 2. tree.Decision…

最新開源免費數字人工具

使用步驟更是簡單到不行&#xff1a; 1. 輸入圖片&#xff1a;選擇你想要生成動態視頻的肖像圖片。 2. 輸入音頻&#xff1a;提供與圖片匹配的音頻文件&#xff0c;EchoMimic會根據音頻內容驅動肖像的動態效果。 3. 設置參數&#xff1a;一般保持默認設置即可&#xff0c;當然&…

排序題目:最小時間差

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法思路和算法代碼復雜度分析 題目 標題和出處 標題&#xff1a;最小時間差 出處&#xff1a;539. 最小時間差 難度 3 級 題目描述 要求 給定一個 24 \texttt{24} 24 小時制的時間列表&#xff0c;時間以 &quo…

暗黑魅力:Xcode全面擁抱應用暗黑模式開發指南

暗黑魅力&#xff1a;Xcode全面擁抱應用暗黑模式開發指南 隨著蘋果在iOS 13和iPadOS 13中引入暗黑模式&#xff0c;用戶可以根據自己的喜好或環境光線選擇不同的界面主題。作為開發者&#xff0c;支持暗黑模式不僅能提升用戶體驗&#xff0c;還能彰顯應用的專業性。Xcode提供了…