二叉树是否是镜像对称
一、判断二叉树是否对称
给定一棵二叉树,判断它是否是自身的镜像(即:是否对称)
例如:下面这棵二叉树是对称的
1
/ \
2 2
/ \ / \
3 4 4 3
下面这棵二叉树不对称。
1
/ \
2 2
\ \
3 3
备注:
希望你可以用递归和迭代两种方法解决这个问题
例如:下面这棵二叉树是对称的
1
/ \
2 2
/ \ / \
3 4 4 3
下面这棵二叉树不对称。
1
/ \
2 2
\ \
3 3
备注:
希望你可以用递归和迭代两种方法解决这个问题
二、示例
输入:{1,2,2} 输出:true
输入:{1,2,3,3,#,2,#} 输出:false
三、算法:
思路:用高度大于2的二叉树举例来说吧,也就是上面第一个例子,只要结点1的左孩子和结点2的右孩子相等,并且结点1的右孩子和结点2的左孩子相等,我们就认为是镜像,前提是结点1和结点2兄弟结点;
递归实现如下:
1 public static boolean isSymmetric(TreeNode root) { 2 if(root == null)
return true; 3 return in(root.left, root.right); 4 } 5 6 7 //递归 8 public static boolean in(TreeNode l1, TreeNode l2){ 9 if(l1 == null && l2 == null)
return true; 10 if(l1 == null || l2 == null)
return false; 11 return l1.val == l2.val && in(l1.left,l2.right) && in(l1.right,l2.left); 12 }
}
非递归调用
//迭代 public static boolean isSymm(TreeNode root){ if(root == null) return true; Queue<TreeNode> q = new LinkedList<>(); q.add(root.left); q.add(root.right); 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.offer(t1.left); q.offer(t2.right); q.offer(t1.right); q.offer(t2.left); } return true; }