一、题目
二、代码实现
方法一:递归
/**
* 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);
//每一棵树的左子树都与另一棵树的右子树镜像对称并且它们的根节点具有相同的值
}
}
执行结果:
时间复杂度:O(n)
空间复杂度:O(n)
方法二:迭代
/**
* 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> q = new LinkedList<>();
q.add(root);
q.add(root);
while (!q.isEmpty()) {
TreeNode t1 = q.poll();
TreeNode t2 = q.poll();
if (t1 == null && t2 == null) continue;
if (t1 == null || t2 == null) return false;
if (t1.val != t2.val) return false;
q.add(t1.left);
q.add(t2.right);
q.add(t1.right);
q.add(t2.left);
}
return true;
}
}
执行结果:
时间复杂度:O(n)
空间复杂度:O(n)
三、收获
方法一(递归)的解题思路是:
如果一个树的左子树与右子树镜像对称,那么这个树是对称的,从而将问题转化为:
两个树在什么情况下互为镜像
对此问题进行思考,发现如果同时满足以下两个条件,两树互为镜像:
(1)它们的两个根节点具有相同的值
(2)每一棵树的右子树都与另一棵树的左子树镜像对称
于是,我们得到方法一的代码
方法二(迭代)的解题思路是:
队列中每两个连续的结点应该是相等的,而且它们的的子树互为镜像
最初,队列中包含的是root和root
该算法的工作原理类似于BFS(Breadth First Search),但是存在一些关键差异
每次提取两个结点并比较它们的值,然后将两个结点的左右子结点按相反的的顺序插入队列中
当队列为空时,或者是检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束