Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
1
/ \
2 2
\ \
3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
递归解法,一遍成功,牛逼去了!!!其实递归的逻辑和判断两个二叉树是否相同一样,所以很容易就写出来了。
/**
* 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) {
TreeNode p=root;
TreeNode q=root;
return isMirror(p,q);
}
Boolean isMirror(TreeNode p,TreeNode q){
if(p==null&&q==null) return true;
if(p==null||q==null) return false;
if(p.val!=q.val) return false;
return isMirror(p.left,q.right)&&isMirror(p.right,q.left);
}
}
为了防止面试的时候让写非递归,看了一些思路,原来没有处理二叉树的思路,看了答案后,豁然开朗。原理二叉树非递归的时候,循环的解决办法类似于先序遍历:
1.把根节点入队列或者栈
2. 循环容器不为空
3. 取出元素处理,然后把左右孩子节点入容器
基本都是这个套路。下面我们来看看利用这个思路解决二叉树是否对称,非递归就是用迭代的方法来求解。我看了leetcode上的代码,思路是对的,但是感觉重复元素进入队列,因为它搞了两个root,我感觉没有必要,所以自己写了一套,完美通过,分享给大家:
主要思路:
1. 搭建遍历二叉树的思路结构
2, 利用队列,把需要“对称比较”的元素,按顺序入队列
3 循环队列不为空,两两出队列进行比较,如果相同,继续,注意是继续,不同返回false
/**
* 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) {
if(root==null) return true;
Queue queue=new LinkedList();
queue.add(root.left);
queue.add(root.right);
while(!queue.isEmpty()){
TreeNode node1=queue.poll();
TreeNode node2=queue.poll();
//开始写成了return,直接返回,应该继续
if(node1==null&&node2==null) continue;
if(node1==null||node2==null) return false;
if(node1.val!=node2.val) return false;
queue.add(node1.left);
queue.add(node2.right);
queue.add(node1.right);
queue.add(node2.left);
}
return true;
}
}