1. 程式人生 > 其它 >劍指 Offer 28. 對稱的二叉樹(遞迴)1

劍指 Offer 28. 對稱的二叉樹(遞迴)1

技術標籤:LeetCode

請實現一個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。

例如,二叉樹[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:

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

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

解法一:遞迴

時間複雜度 O(N): 其中 N 為二叉樹的節點數量,每次執行 recur() 可以判斷一對節點是否對稱,因此最多呼叫 N/2 次 recur() 方法。

空間複雜度 O(N): 最差情況下(見下圖),二叉樹退化為連結串列,系統使用 O(N)大小的棧空間。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return root == null ? true : recur(root.left, root.right);
    }
    
    boolean recur(TreeNode L, TreeNode R) {
        if(L == null && R == null) return true;
        if(L == null || R == null || L.val != R.val) return false;
        return recur(L.left, R.right) && recur(L.right, R.left);
    }

}