1. 程式人生 > 其它 >力扣 - 劍指 Offer 28. 對稱的二叉樹

力扣 - 劍指 Offer 28. 對稱的二叉樹

題目

劍指 Offer 28. 對稱的二叉樹

思路1

  • 看到這題首先想到可以將二叉樹複製一份映象的,然後進行後續遍歷比較兩棵樹的每一個節點是否相等,但是這樣未免太複雜了,因此我們可以用更好的方法來解決
  • 一般來說,二叉樹的後續遍歷是從左子樹開始的,但是我們也可以調換一下位置,從右子樹開始遞迴,這樣子和左邊開始是對稱的方向
  • 同時,我們要如何判斷是否是對稱的呢?要求左邊的和右邊以根節點垂直方向為對稱軸對稱,那麼整個二叉樹就是對稱的;那對於根節點的左子樹和右子樹來說要保證:左子樹的左子樹右子樹的右子樹左子樹的右子樹右子樹的左子樹這些對稱即可,然後一直遞迴下去判斷,直到判斷完整個樹,但是如果其中有一個是不對稱的,那麼就會返回
    false,即整個樹是不對稱的

程式碼

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }

        return help(root.left, root.right);
    }

    public boolean help(TreeNode node1, TreeNode node2) {
        // 只要其中一個為null,就需要判斷是否都為null
        // 如果都為null,返回true,說明遍歷到葉子節點了
        // 如果其中一個為不為null,返回false
        if (node1 == null || node2 == null) {
            return node1 == node2;
        }

        // 節點的值不相等也返回false
        if (node1.val != node2.val) {
            return false;
        }

        // 然後再進行遞迴兩棵樹的左右子樹進行比較,只要有一個為false,就不是對稱的
        return help(node1.left, node2.right) && help(node1.right, node2.left);
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\)
  • 空間複雜度:\(O(N)\)
我走得很慢,但我從不後退!