来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree/
描述
给定一个二叉树,检查它是否是镜像对称的。
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
题解
递归法
/**
* 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) {
return isMirror(root, root);
}
public boolean isMirror(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val) && isMirror(t1.left, t2.right) && isMirror(t1.right, t2.left);
}
}
复杂度分析
- 时间复杂度:
,因为我们遍历整个输入树一次,所以总的运行时间为
,其中
是树中结点的总数。
空间复杂度:递归调用的次数受树的高度限制。在最糟糕情况下,树是线性的,其高度为
。因此,在最糟糕的情况下,由栈上的递归调用造成的空间复杂度为
。
迭代法
/**
* 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) {
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
queue.add(root);
while (!queue.isEmpty()) {
TreeNode t1 = queue.poll();
TreeNode t2 = queue.poll();
if (t1 == null && t2 == null) {
continue;
}
if (t1 == null || t2 == null) {
return false;
}
if (t1.val != t2.val) {
return false;
}
queue.add(t1.left);
queue.add(t2.right);
queue.add(t1.right);
queue.add(t2.left);
}
return true;
}
}
复杂度分析
时间复杂度:
,因为我们遍历整个输入树一次,所以总的运行时间为
,其中
是树中结点的总数。
- 空间复杂度:搜索队列需要额外的空间。在最糟糕情况下,我们不得不向队列中插入
个结点。因此,空间复杂度为
。