題目描述:java
給定一個二叉樹,檢查它是不是鏡像對稱的。node
例如,二叉樹 [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 說明: 若是你能夠運用遞歸和迭代兩種方法解決這個問題,會很加分。
思路解析:測試
思路一:對二叉樹進行中序遍歷,判斷節點值是否對稱分佈(LeetCode測試用例未經過,但本地測試經過)blog
public static boolean isSymmetric(TreeNode root) { List<Integer> res = new ArrayList<>(); dfsTraverse(root, res); return validate(res); } private static boolean validate(List<Integer> res) { for (int i = 0; i < res.size() / 2; i++) { if (!res.get(i).equals(res.get(res.size() - 1 - i))) { return false; } } return true; } private static void dfsTraverse(TreeNode root, List<Integer> res) { if (root == null) { res.add(Integer.MAX_VALUE); return; } dfsTraverse(root.left, res); res.add(root.val); dfsTraverse(root.right, res); }
思路二:遞歸遞歸
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public static boolean isSymmetric(TreeNode root) { if (root == null) { return true; } return validate(root.left, root.right); } private static boolean validate(TreeNode pNode, TreeNode qNode) { if (pNode == null && qNode == null) { return true; } if (pNode != null && qNode != null && pNode.val == qNode.val) { return validate(pNode.left, qNode.right) && validate(pNode.right, qNode.left); } else { return false; } } }