DFS
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public boolean isSymmetric(TreeNode root) { return isSymmetric(root.left, root.right); }
private boolean isSymmetric(TreeNode left, TreeNode right) { if (left != null && right != null) { return left.val == right.val && isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left); } else { return left == null && right == null; } } }
|
BFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) { return true; }
Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root.left); queue.offer(root.right);
while (!queue.isEmpty()) { TreeNode nodeA = queue.poll(); TreeNode nodeB = queue.poll();
if (nodeA == null && nodeB == null) { continue; }
if (nodeA != null && nodeB != null) { if (nodeA.val == nodeB.val) { queue.offer(nodeA.left); queue.offer(nodeB.right); queue.offer(nodeA.right); queue.offer(nodeB.left); } else { return false; } } else { return false; } }
return true; } }
|
此题需要注意的是对称的定义,对称不仅仅要求左子节点的值与右子节点的值相等,而且需要左子节点的右子节点与右子节点的左子节点相等,且右子节点的左子节点与左子节点的右子节点相等。
References
101. Symmetric Tree
剑指 Offer 28. 对称的二叉树
动画演示+多种实现 101. 对称二叉树