LeetCode101-对称二叉树

题目链接

英文链接:https://leetcode.com/problems/symmetric-tree/

中文链接:https://leetcode-cn.com/problems/symmetric-tree/

题目详述

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

1
2
3
4
5
    1
/ \
2 2
/ \ / \
3 4 4 3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

1
2
3
4
5
  1
/ \
2 2
\ \
3 3

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

题目详解

判断两个二叉树镜像对称的三个关键点:

  • 两个结点当前的值是否相同
  • 一个结点的左子树和另一个结点的右子树是否镜像对称。
  • 一个结点的右子树和另一个结点的左子树是否镜像对称。

注意整个过程中 null 的判断。

一棵树的做法:

递归版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class LeetCode_00101 {

public boolean isSymmetric(TreeNode root) {
// root 为 null 返回 true,否则判断它的左右子树是否是对称的
return root == null || isSymmetric(root.left, root.right);
}

public boolean isSymmetric(TreeNode left, TreeNode right) {
// left 和 null 均为 null 时 返回 true,仅有一个返回 false
if (left == null || right == null) {
return left == right;
}
return left.val == right.val && isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}
}

迭代版本(运用栈):

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
package com.github.jerring.leetcode;

import java.util.LinkedList;

public class LeetCode_00101 {

public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
LinkedList<TreeNode> stack = new LinkedList<>();
stack.push(root.left);
stack.push(root.right);
while (!stack.isEmpty()) {
TreeNode right = stack.pop();
TreeNode left = stack.pop();
if (left == null && right == null) {
continue;
}
if (left == null || right == null) {
return false;
}
if (left.val != right.val) {
return false;
}
stack.push(left.left);
stack.push(right.right);
stack.push(left.right);
stack.push(right.left);
}
return true;
}
}

两棵树的做法:

递归版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class LeetCode_00101 {

public boolean isSymmetric(TreeNode root) {
return isMirror(root, root);
}

private boolean isMirror(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
return p.val == q.val && isMirror(p.left, q.right) && isMirror(p.right, q.left);
}
}

迭代版本(运用队列):

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
public class LeetCode_00101 {

public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode p = queue.poll();
TreeNode q = queue.poll();
if (p == null && q == null) {
continue;
}
if (p == null || q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
queue.offer(p.left);
queue.offer(q.right);
queue.offer(p.right);
queue.offer(q.left);
}
return true;
}
}