力扣 - 劍指 Offer 28. 對稱的二叉樹
阿新 • • 發佈:2021-11-24
題目
思路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)\)