一、题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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、递归
思路: 看代码很容易理解,重要的还是Bug-free地实现。具体过程参考1有个幻灯片,可以看下。
代码:
class Solution {
public boolean isSymmetric(TreeNode root) {
return root == null ? true : recur(root.left, root.right);
}
boolean recur(TreeNode L, TreeNode R) {
if(L == null && R == null) return true;
if(L == null || R == null || L.val != R.val) return false;
return recur(L.left, R.right) && recur(L.right, R.left);
}
}
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
2、迭代
思路:
附一下BFS模板,可参照改动。
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public List<List<Integer>> BFS(TreeNode root) {
List<List<Integer>> allResults = new ArrayList<>();
if (root == null) return allResults;
Queue<TreeNode> nodes = new LinkedList<>();
nodes.add(root);
while (!nodes.isEmpty()) {
int levelSize = nodes.size();
List<Integer> results = new ArrayList<>();
for (int i = 0; i < levelSize; i++) {
TreeNode currNode = nodes.poll();
results.add(currNode.val);
if (currNode.left != null) nodes.add(currNode.left);
if (currNode.right != null) nodes.add(currNode.right);
}
allResults.add(results);
}
return allResults;
}
代码:
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> que = new LinkedList<>();
que.add(root.left); // 将左子树头结点加入队列
que.add(root.right); // 将右子树头结点加入队列
while (!que.isEmpty()) { // 接下来就要判断这这两个树是否相互翻转
TreeNode leftNode = que.poll();
TreeNode rightNode = que.poll();
if (leftNode == null && rightNode == null) { // 左节点为空、右节点为空,此时说明是对称的
continue;
}
// 左右一个节点不为空,或者都不为空但数值不相同,返回false
if ((leftNode == null || rightNode == null || (leftNode.val != rightNode.val))) {
return false;
}
que.add(leftNode.left); // 加入左节点左孩子
que.add(rightNode.right); // 加入右节点右孩子
que.add(leftNode.right); // 加入左节点右孩子
que.add(rightNode.left); // 加入右节点左孩子
}
return true;
}
}
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)