1 題目描述
給定一個二叉樹,檢查它是否是鏡像對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/symmetric-tree
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
採用的方法是遞歸,參照遞歸套路三部曲來做,遞歸題目的詳細瞭解和總結,可以看另一篇博客 套路俘虜–遞歸–的芳心,就是你,沒錯了~~,非常簡潔容易理解
-
第一步,找終止條件
都爲空指針則返回 true
只有一個爲空則返回 false -
第二步,判斷本層遞歸做什麼,遞歸過程就是去比較是不是對稱
判斷兩個指針當前節點值是否相等
判斷 A 的右子樹與 B 的左子樹是否對稱
判斷 A 的左子樹與 B 的右子樹是否對稱 -
第三步,返回值
返回值在這裏, 指的是到底是不是對稱,true 或者 false 的布爾值
寫代碼的時候,二三步合併了
這裏牽扯到短路現象:
在遞歸判斷過程中存在短路現象,也就是做 與 操作時,如果前面的值返回 false 則後面的不再進行計算
3 解決代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
return isMirror(root, root);
}
public boolean isMirror(TreeNode t1, TreeNode t2){
//第一步,遞歸結束條件:都爲空指針則返回 true,只有一個爲空則返回 false
if(t1 == null && t2 == null) return true;
if(t1 == null || t2 == null) return false;
//第二步,遞歸過程,判斷到底是不是對稱,分情況分析
//第三步,返回值,返回是否對稱的布爾值
return (t1.val == t2.val) && isMirror(t1.right,t2.left) && isMirror(t1.left,t2.right);
}
}