101. 对称二叉树
Tag Tree
DFS
BFS
Difficulty Easy
Link 101. 对称二叉树
分析
使用深度优先搜索来解决这个问题,
第一种是递归解法,使用左右指针left, right
分别指向左子树与右子树
基准情况:
-
两个指针都为空,返回
true
-
两个指针只有一个为空,返回
false
递归过程:
- 判断两个指针当前节点值是否相等
- 判断
left
指针的右子树与right
指针的左子树是否相等 - 判断
left
指针的左子树与right
指针的右子树是否相等
满足递归过程中的三个条件可以使得二叉树是对称的,一旦出现不满足的情况,返回false
第二种是迭代的方式,可以根据递归情况来改写。
用广度优先搜索的思想,使用队列来存储节点,因为同一层的两个节点的子树互为镜像,所以每两个相邻的节点值应该相等。
题解
1. 递归解法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode r1, TreeNode r2) {
if (r1==null && r2==null) return true;
if (r1==null || r2==null) return false;
return (r1.val == r2.val) && isMirror(r1.right, r2.left) && isMirror(r1.left, r2.right);
}
}
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
2. 迭代解法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root.left);
q.offer(root.right);
while (!q.isEmpty()) {
TreeNode r1 = q.poll();
TreeNode r2 =q.poll();
if (r1==null && r2==null) continue;
if (r1==null || r2==null) return false;
if (r1.val != r2.val) return false;
q.offer(r1.left);
q.offer(r2.right);
q.offer(r1.right);
q.offer(r2.left);
}
return true;
}
}
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)