【Leetcode】101. 對稱二叉樹
題目
給定一個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
1 / \ 22 / \ / \ 34 43
但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:
1 / \ 22 \\ 33
題解
還記得我們上幾次說過,二叉樹的題目,大多數可以用遞迴解決。
而遞迴主要確定兩點:
- 遞迴的子問題是什麼;
- 遞迴的結束條件是什麼
這個題這兩點都不難找到,直接看程式碼吧。
/** * 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 root == null || isSymmetricHelp(root.left, root.right); } private boolean isSymmetricHelp(TreeNode left, TreeNode right) { if (left == null || right == null) return left == right; if (left.val != right.val) return false; return isSymmetricHelp(left.left, right.right) && isSymmetricHelp(left.right, right.left); } }
這個題目還要求用非遞迴的方式去解.
一種很直觀的想法就是利用層序遍歷,看它是不是對稱的.
入隊順序依次是, 左子樹的左兒子,右子樹的右兒子
左子樹的右兒子,右子樹左右兒子。
這樣出隊的時候兩兩檢查是不是對稱。
public boolean isSymmetric(TreeNode root) { Queue<TreeNode> q = new LinkedList<TreeNode>(); if(root == null) return true; q.add(root.left); q.add(root.right); while(!q.isEmpty()){ TreeNode left = q.poll(); TreeNode right = q.poll(); // 葉子節點. if(left== null&& right == null) continue; // 其中一個為null 肯定不是 if(left == null ^ right == null) return false; // 值不相同 if(left.val != right.val) return false; q.add(left.left); q.add(right.right); q.add(left.right); q.add(right.left); } return true; }