【c++刷題學習筆記目錄】【c++百萬併發網路通訊-筆記目錄】
給定乙個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹[1,2,2,3,4,4,3]
是對稱的。
1
/ \2 2
/ \ / \
3 4 4 3
但是下面這個[1,2,2,null,3,null,3]
則不是映象對稱的:
1
/ \2 2
\ \
3 3
遞迴三步法、二叉樹中所有複雜的操作與最初(兩層,三層)二叉樹的操作都是一樣的,只要在基礎版本進行遞迴成功,後面複雜的情況就迎刃而解
最開始思路是:按照層序遍歷將每一層的節點儲存下來,然後從儲存下來的陣列使用雙指標從首尾逐個比較
【**隨想錄】大佬給出了一種類似於後序遍歷的解法
思路:判斷二叉樹映象對稱 等效於 判斷根節點的左右子樹是否相同,也就是說要同時遍歷兩顆子樹,對於示例1中的對稱二叉樹,假設在第三層[3 4 4 3]
對比,前兩個節點在左子樹,後兩個節點在右子樹,使用left
表示左子樹的當前節點,right
表示右子樹的當前節點,需要從外向內進行比較。也就是先比較左子樹左孩子與右子樹右孩子,然後比較左子樹右孩子與右子樹左孩子。
按照遞迴三步法考慮:
1、返回值和引數:
既然是判斷,返回值就是bool
;在同一時刻只比較左右子樹對稱位置上的節點,因此需要left
和right
兩個treenode*
引數
2、遞迴結束條件:
首先需要解決空節點的問題,這裡有三種情況,(1)左空&&右不空
,(2)左不空&&右空
,(3)左空&&右空
。排除(1)(2)(3)這三種情況後,剩下的就是左不空&&右不空
,只有在這種前提下,左值==右值
才有必要繼續遞迴檢視下一層是否對稱
//排除空節點
if(left ==
nullptr
&& right !=
nullptr
)return
false
;else
if(left !=
nullptr
&& right ==
nullptr
)return
false
;else
if(left ==
nullptr
&& right ==
nullptr
)return
true
;//排除空節點後,再排除兩個結點不同
else
if(left-
>val != right-
>val)
return
false
;
3、單層遞迴邏輯:
邏輯就是需要對比下一層左右子樹最外側與最內側的節點值是否相同
這裡需要注意:如果畫的圖層數太多導致情況太複雜,可以先從(兩層,三層)來畫圖思考。遞迴本身就是套娃,層數越多越難想
參考:
二叉樹:我對稱麼?
力扣 101 對稱二叉樹
一 題目描述 給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 二 解題思路 遞迴思想。1 先判斷根節點是否為空節點 2 判斷左子樹a和右...
101 對稱二叉樹 (力扣)
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3bool issymmetric2 struct treenode q,struct tr...
力扣101 對稱二叉樹
判斷二叉樹是否對稱 給定一棵二叉樹,判斷琪是否是自身的映象 即 是否對稱 例如 下面這棵二叉樹是對稱的 2 2 3 4 4 3 下面這棵二叉樹不對稱。2 2 3 3 備註 希望你可以用遞迴和迭代兩種方法解決這個問題 示例1輸入 輸出true 示例2輸入 輸出false 對稱二叉樹 模式識別 深度搜尋...