题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/
2 2
/ \ /
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/
2 2
\
3 3
分析
这道题目,使用递归、迭代是比较好的解法。
代码
迭代
- 迭代解题我还是第一次使用,队列解题我也是第一次使用;
- 先说说队列的概念吧,一句话说就是队头删队尾插;
- 对于这道题目的解答,我选择转载官方解答:每次提取两个结点并比较它们的值。然后,将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束;
- 它的判定和我做的递归中的基本一样。不同的点就是用了队列的处理方式,处理了进队、从队中删除。
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 (t2 == null || t1 == 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;
}
递归
- 与100的结题方法基本一致,递归的C++代码我也写了一遍,和下面这个基本一样。
- 为了方便大家都会写一个判断函数,返回类型是boolean的,判断到最后都为空了就true了;一个为空一个不为空一定不对称;其余的先看结点值是否相等,然后两个结点一个p、一个q,做参数再去递归判断,left、right
- 这种对应关系就不用拿文字说了,还不如看图呢对吧;
- 我对于递归的一点理解,就是你这次能判断的,交给下一次,它也能判断,所以不用担心下一次,关键是写对下一次的参数就好了。
class Solution {
public boolean isTrue(TreeNode p, TreeNode q)
{
if (p == null && q == null) return true;
if (p == null || q == null) return false;
else return (p.val == q.val) && isTrue(p.left, q.right) && isTrue(p.right, q.left);
}
public boolean isSymmetric(TreeNode root)
{
return isTrue(root, root);
}
}
参考
LeetCode官方题解