力扣每日一題day31[101. 對稱二叉樹]

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

示例 1:

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

示例 2:

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

思路

對于二叉樹是否對稱,要比較的是根節點的左子樹與右子樹是不是相互翻轉的,其實我們要比較的是兩個樹(這兩個樹是根節點的左右子樹),所以在遞歸遍歷的過程中,也是要同時遍歷兩棵樹。

那么如何比較?

比較的是兩個子樹的里側和外側的元素是否相等。

那么遍歷的順序應該是什么樣的?

本題遍歷只能是“后序遍歷”,因為我們要通過遞歸函數的返回值來判斷兩個子樹的內側節點和外側節點是否相等。

正是因為要遍歷兩棵樹而且要比較內側和外側節點,所以準確的來說是一個樹的遍歷順序是左右中,一個樹的遍歷順序是右左中。

遞歸法

確定遞歸函數的參數和返回值 因為我們要比較的是根節點的兩個子樹是否是相互翻轉的,進而判斷這個樹是不是對稱樹,所以要比較的是兩個樹,參數自然也是左子樹節點和右子樹節點。

返回值自然是bool類型。

代碼如下:

bool compare(TreeNode left, TreeNode right) 確定終止條件 要比較兩個節點數值相不相同

節點為空的情況有:

左節點為空,右節點不為空,不對稱,return false 左不為空,右為空,不對稱 return false 左右都為空,對稱,返回true 此時已經排除掉了節點為空的情況,那么剩下的就是左右節點不為空:

左右都不為空,比較節點數值,不相同就return false 此時左右節點不為空,且數值也不相同的情況我們也處理了。

代碼如下:

if (left == NULL && right != NULL) return false; else if (left != NULL && right == NULL) return false; else if (left == NULL && right == NULL) return true; else if (left->val != right->val) return false; 因為我們把以上情況都排除之后,剩下的就是 左右節點都不為空,且數值相同的情況。

確定單層遞歸的邏輯 此時才進入單層遞歸的邏輯,單層遞歸的邏輯就是處理 左右節點都不為空,且數值相同的情況。

比較二叉樹外側是否對稱:傳入的是左節點的左孩子,右節點的右孩子。 比較內測是否對稱,傳入左節點的右孩子,右節點的左孩子。 如果左右都對稱就返回true ,有一側不對稱就返回false 。 代碼如下:

bool outside = compare(left.left, right.right); // 左子樹:左、 右子樹:右 bool inside = compare(left.right, right.left); // 左子樹:右、 右子樹:左 bool isSame = outside && inside; // 左子樹:中、 右子樹:中(邏輯處理) return isSame; 我們可以看出使用的遍歷方式,左子樹左右中,右子樹右左中

/*** Definition for a binary tree node.* public class TreeNode {* ? ? int val;* ? ? TreeNode left;* ? ? TreeNode right;* ? ? TreeNode() {}* ? ? TreeNode(int val) { this.val = val; }* ? ? TreeNode(int val, TreeNode left, TreeNode right) {* ? ? ? ? this.val = val;* ? ? ? ? this.left = left;* ? ? ? ? this.right = right;* ? ? }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {if(root==null) return true;return compare(root.left,root.right);
?}boolean compare(TreeNode left,TreeNode right){if(left==null&&right!=null) return false;else if(right==null&&left!=null) return false;else if(left==null&&right==null) return true;else if(left.val!=right.val) return false;
?boolean outside=compare(left.left,right.right);boolean inside=compare(left.right,right.left);return outside&&inside;}
}

迭代法

可以使用棧來比較兩個樹(根節點的左右子樹)是否相互翻轉

也可以使用隊列

class Solution {public boolean isSymmetric(TreeNode root) {if(root==null) return true;Stack<TreeNode> stack=new Stack<>();stack.push(root.left);stack.push(root.right);while(!stack.isEmpty()){TreeNode right=stack.pop();TreeNode left=stack.pop();if(left==null && right==null){continue;}if(left==null ||right==null||(left.val!=right.val)){return false;}stack.push(left.right);stack.push(right.left);stack.push(left.left);stack.push(right.right);}return true;}
}

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

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

相關文章

二分查找算法

文章目錄 二分查找二分的實戰講解二分查找普通二分模版 在排序數組中查找元素的第一個和最后一個位置萬能二分模版 總結 二分查找 什么是二分查找:就是定義左右2個指針(此指針非真指針)取中間值 通過一次次取中間值找到要找到的數 二分的實戰講解 二分查找 題目:地址 題目解析…

ELK技術棧介紹及簡單使用實例

1. ELK技術棧介紹 引言 在當今數據驅動的世界里&#xff0c;有效地管理和分析大量日志數據變得至關重要。這里我們將深入探討ELK技術棧&#xff0c;這是一種流行的日志管理解決方案&#xff0c;它結合了三個開源項目&#xff1a;Elasticsearch、Logstash和Kibana。ELK技術棧因…

測試文檔---智力沖刺

文章目錄 項目背景測試計劃UI測試接口測試手工測試 測試總結 項目背景 項目描述&#xff1a;“智力沖刺”是一款網頁小游戲&#xff0c;就像我們平時看到的網頁游戲一樣&#xff0c;前端頁面負責展示游戲效果&#xff0c;后端服務器來實現游戲的邏輯。在我們的“智力沖刺”游戲…

YOLOv7 學習筆記

文章目錄 前言一、YOLOv7貢獻和改進二、YOLOv7核心概念三、YOLOv7架構改進總結 前言 在深度學習和計算機視覺領域&#xff0c;目標檢測一直是一個極具挑戰性和實用性的研究領域。特別是在實時目標檢測方面&#xff0c;準確率和速度之間的平衡成為了關鍵考量因素。YOLO&#xf…

C語言精選——選擇題Day40

第一題 1. int a[10] {2,3,5}, 請問a[3]及a[3]之后的數值是&#xff08;&#xff09; A&#xff1a;不確定的數據 B&#xff1a;5 C&#xff1a;0 D&#xff1a;0xf f f f f f f f 答案及解析 C 數組的不完全初始化&#xff0c;會自動把沒初始化的部分初始化為0&#xff1b; 第…

postman做接口自動化測試

接口是用來連接服務端和客戶端&#xff0c;一般返回的數據都是json。 get和post請求的區別&#xff1a; 1. get請求比post請求安全 2. get請求參數有長度限制&#xff0c;post請求沒有 3. get請求沒有body&#xff0c;參數都是放在url里面&#xff0c;而post請求是放在body…

大華DSS S2-045 OGNL表達式注入漏洞復現

0x01 產品簡介 大華DSS安防監控系統平臺是一款集視頻、報警、存儲、管理于一體的綜合安防解決方案。該平臺支持多種接入方式,包括網絡視頻、模擬視頻、數字視頻、IP電話、對講機等。此外,該平臺還支持多種報警方式,包括移動偵測、區域入侵、越線報警、人員聚集等。 0x02 漏…

元宇宙:重塑游戲行業體驗下一個前沿

游戲行業在其整個歷史中經歷了顯著的轉變&#xff0c;從超級馬里奧的像素化冒險發展到Red Dead Redemption等游戲中迷人的開放世界體驗。隨著時間的推移&#xff0c;游戲不斷突破數字領域所能達到的極限。然而&#xff0c;被稱為元宇宙的突破性演變將徹底改變游戲行業&#xff…

PO模式在selenium自動化測試框架有什么好處

PO模式是在UI自動化測試過程當中使用非常頻繁的一種設計模式&#xff0c;使用這種模式后&#xff0c;可以有效的提升代碼的復用能力&#xff0c;并且讓自動化測試代碼維護起來更加方便。 PO模式的全稱叫page object model&#xff08;POM&#xff09;&#xff0c;有時候叫做 p…

網工內推 | 外企、合資公司急招網工,國內外旅游,健身年卡

01 深圳市耐施菲信息科技有限公司 招聘崗位&#xff1a;網絡工程師 職責描述&#xff1a; 1、負責項目的計劃、實施、過程管控、項目驗收等工作&#xff1b; 2、負責大型項目設備實施、安裝調試等售后維護工作&#xff1b; 3、分析、設計網絡拓撲結構、配置H3C、華為等交換機…

SQL FOREIGN KEY 約束- 保障表之間關系完整性的關鍵規則

SQL FOREIGN KEY 約束 SQL FOREIGN KEY 約束用于防止破壞表之間關系的操作。FOREIGN KEY 是一張表中的字段&#xff08;或字段集合&#xff09;&#xff0c;它引用另一張表中的主鍵。具有外鍵的表稱為子表&#xff0c;具有主鍵的表稱為被引用表或父表。 以下是兩個表的例子&a…

dll動態鏈接庫【C#】

1說明&#xff1a; 在C#中&#xff0c;dll是添加 【類庫】生成的。 2添加C#的dll&#xff1a; &#xff08;1&#xff09;在VS中新建一個Windows應用程序項目&#xff0c;并命名為TransferDll。 &#xff08;2&#xff09;打開Windows窗體設計器&#xff0c;從工具箱中為窗體…

Unity 性能優化的手段【更新中】

目錄 對象池 減少Draw Calls 批處理 合并網格 貼圖集 LOD 基本原理 應用 優點 挑戰 LightMap 基本概念 如何工作 優點 缺點 對象池 使用對象池&#xff1a;頻繁地創建和銷毀對象會導致性能下降和內存碎片化。對象池可以預先創建一些對象&#xff0c;然后在需要時…

【數據開發】Hive 多表join中的條件過濾與指定分區

1、條件過濾 left join 中 on 后面加條件 where 和 and 的區別 1、 on條件是在生成臨時表時使用的條件&#xff0c;它不管and中的條件是否為真&#xff0c;都會保留左邊表中的全部記錄。2、where條件是在臨時表生成好后&#xff0c;再對臨時表進行過濾的條件。這時已經沒有le…

Gemini:新一代AI產品的驚人功能和革命性影響

目錄 1 前言2 視頻分析與交互能力3 策劃推理能力4 教育領域的應用能力5 科學領域的論文解讀能力6 結語 1 前言 Google最新推出的AI產品Gemini引發了廣泛關注&#xff0c;其30分鐘的介紹和演示視頻展示了令人驚艷的功能。Gemini以其驚人的藝術創作能力脫穎而出&#xff0c;通過…

TCP一對一聊天

客戶端 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io…

python-04(入門基礎篇4——lists相關的部分語法)

python-04&#xff08;入門基礎篇4——lists相關的部分語法&#xff09; 1. 前言1.1 python入門1.2 參考官網 2. 關于索引和切片3. 在列表追加元素3.1 支持拼接3.2 使用list.append() 方法在列表末尾添加新項 4. 列表是可變類型4.1 更改其中某元素內容4.2 使用切片更改列表大小…

cesium學習記錄

有段時間自學了cesium&#xff0c;這里記錄一下自學過程&#xff0c;希望在所需之時查閱~~ 1、cesium源碼獲取與Index頁面介紹 官網網址 www.cesiumjs.org 源代碼下載&#xff1a;Platform-Dowmloads 在index.html右擊open with Live server開啟本地服務 點擊Documentation…

mysql 表分區類型

在MySQL中&#xff0c;有幾種不同類型的分區可以用于對表進行分區。以下是MySQL中常用的分區類型&#xff1a; 1. RANGE分區&#xff1a;基于給定的列范圍進行分區。例如&#xff0c;可以按照日期范圍或數值范圍對表進行分區。 CREATE TABLE sales (id INT NOT NULL AUTO_INC…

VMware安裝OpenEuler(安裝界面)

本文中使用的OpenEuler版本&#xff1a;22.03 LTS SP2 VMware&#xff1a;17.0.0 一、下載鏡像 根據CPU和場景&#xff0c;按需下載 https://www.openeuler.org/zh/download/?versionopenEuler%2022.03%20LTS%20SP2 二、初始化VmWare 三、配置操作系統 四、安裝操作系統 …