101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
解法
1. 递归
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return traversal(root.left, root.right);
}
public boolean traversal(TreeNode nodeLeft, TreeNode nodeRight){
if (nodeLeft == null && nodeRight != null){
return false;
}
if (nodeLeft != null && nodeRight == null){
return false;
}
if (nodeLeft == null && nodeRight == null){
return true;
}
if (nodeLeft.val != nodeRight.val){
return false;
}
boolean flagOutside = traversal(nodeLeft.left, nodeRight.right);
boolean flagInside = traversal(nodeLeft.right, nodeRight.left);
return flagOutside && flagInside;
}
}
2. 迭代
使用分层遍历的思路
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root.left);
deque.offer(root.right);
while (!deque.isEmpty()){
TreeNode rightNode = deque.poll();
TreeNode leftNode = deque.poll();
if (rightNode == null && leftNode == null){
continue;
}
if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {
return false;
}
deque.offer(leftNode.left);
deque.offer(rightNode.right);
deque.offer(leftNode.right);
deque.offer(rightNode.left);
}
return true;
}
}