题目大意:
给定一个二叉树,判断其是否是自己的镜像,即是否左右对称。
注:有递归解法和迭代解法。
解题思路:
首先,递归的解法最容易想到。这里用到了函数的重载,也可以写个别的函数名。代码表现得更加直观,注意迭代时参数的左右比较写法。
如果同时满足下面的条件,两个树互为镜像:
1.它们的两个根结点具有相同的值。
2.每个树的右子树都与另一个树的左子树镜像对称。
其次,迭代的解法用到了队列。算法类似BFS,但是还是有些不同。首先,最初队列中进两次root
,其次,每次提取两个结点并比较它们的值。之后,将两个结点的左右子结点按相反的顺序插入队列中。当队列为空或我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,算法结束。
代码: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
34递归:
Java:
public boolean isSymmetric(TreeNode root){
if(root == null) return true;
return isSymmetric(root.left,root.right);
}
private boolean isSymmetric(TreeNode t1,TreeNode t2){
if(t1 == null && t2 == null) return true;
if(t1 == null || t2 == null) return false;
if(t1.val != t2.val) return false;
return isSymmetric(t1.left,t2.right) && isSymmetric(t1.right,t2.left);
}
迭代:
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;
}