来源
来源:力扣(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;}}
复杂度分析
时间复杂度:
,因为我们遍历整个输入树一次,所以总的运行时间为
,其中
是树中结点的总数。
- 空间复杂度:搜索队列需要额外的空间。在最糟糕情况下,我们不得不向队列中插入
个结点。因此,空间复杂度为
。
