給定一棵二叉樹,判斷這棵樹是否是對稱的。對稱的含義是:這棵樹的左子樹和右子樹在結構上是鏡像對稱的,且對應節點的值相等。
示例 1:
????1/?\2???2/?\?/?\
3??4?4??3輸出:true
示例 2:
????1/?\2???2\???\3????3輸出:false
二、應用場景
- ? 用戶界面或布局中驗證左右對稱性
- ? 算法競賽題目或筆試面試常考
- ? 樹結構可視化或分析工具中,對稱性判斷用于簡化處理
三、解題思路
本問題的關鍵在于:比較樹的左子樹和右子樹是否鏡像對稱。
我們可以采用兩種方法:
方法一:遞歸判斷
判斷左右子樹是否滿足以下三個條件:
- 1. 左子樹的左子樹和右子樹的右子樹對稱;
- 2. 左子樹的右子樹和右子樹的左子樹對稱;
- 3. 當前兩個節點值相同。
方法二:迭代判斷(借助隊列)
使用隊列存儲成對的節點,每次成對彈出并比較:
- ? 若都為空,繼續;
- ? 若一個為空另一個不為空 → 不對稱;
- ? 值不相等 → 不對稱;
- ? 否則將子節點成對壓入隊列,繼續判斷。
四、Go語言實現
1. 數據結構定義
package?mainimport?"fmt"type?TreeNode?struct?{Val???intLeft??*TreeNodeRight?*TreeNode
}
2. 方法一:遞歸法
func?isSymmetric(root?*TreeNode)?bool?{if?root?==?nil?{return?true}return?isMirror(root.Left,?root.Right)
}func?isMirror(left,?right?*TreeNode)?bool?{if?left?==?nil?&&?right?==?nil?{return?true}if?left?==?nil?||?right?==?nil?{return?false}if?left.Val?!=?right.Val?{return?false}return?isMirror(left.Left,?right.Right)?&&?isMirror(left.Right,?right.Left)
}
3. 方法二:迭代法(使用隊列)
func?isSymmetricIterative(root?*TreeNode)?bool?{if?root?==?nil?{return?true}queue?:=?[]*TreeNode{root.Left,?root.Right}for?len(queue)?>?0?{left?:=?queue[0]right?:=?queue[1]queue?=?queue[2:]if?left?==?nil?&&?right?==?nil?{continue}if?left?==?nil?||?right?==?nil?||?left.Val?!=?right.Val?{return?false}queue?=?append(queue,?left.Left,?right.Right)queue?=?append(queue,?left.Right,?right.Left)}return?true
}
五、測試樣例
func?main()?{//?構建對稱二叉樹root?:=?&TreeNode{Val:?1}root.Left?=?&TreeNode{Val:?2}root.Right?=?&TreeNode{Val:?2}root.Left.Left?=?&TreeNode{Val:?3}root.Left.Right?=?&TreeNode{Val:?4}root.Right.Left?=?&TreeNode{Val:?4}root.Right.Right?=?&TreeNode{Val:?3}fmt.Println("遞歸判斷結果:",?isSymmetric(root))???????????//?truefmt.Println("迭代判斷結果:",?isSymmetricIterative(root))?//?true
}
六、復雜度分析
方式 | 時間復雜度 | 空間復雜度 |
遞歸法 | O(n) | O(h) |
迭代法 | O(n) | O(n) |
- ? n 表示節點數量;
- ? h 表示樹的高度(遞歸調用棧的深度);
- ? 迭代方法使用了隊列,需要額外 O(n) 空間存儲節點。
七、可視化理解
將二叉樹從中心線對折,看左、右兩部分是否完全重合,節點值是否相等。
鏡像對稱結構滿足:
- ??
left.Left
?==?right.Right
- ??
left.Right
?==?right.Left
八、變種與擴展
- 1.?判斷 N 叉樹是否鏡像對稱:需要成對比較左右子節點;
- 2.?輸出是否對稱的最小修改操作:可結合動態規劃思想;
- 3.?判斷對稱層級:例如僅判斷前兩層是否對稱。
九、總結
內容 | 說明 |
核心判斷條件 | 左右子樹是否鏡像結構,對應節點值是否相等 |
遞歸 vs 迭代 | 遞歸寫法更直觀,迭代適合大樹或避免棧溢出 |
技巧點 | 左-右子樹配對判斷,使用隊列模擬遞歸過程 |
實用價值 | 面試高頻,掌握樹結構對稱性判斷通用技巧 |