Java实现判断二叉树是否镜像对称
该二叉树镜像对称
该二叉树不对称
两种方法
1、递归
2、中序遍历迭代
二叉树结构
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
实现方法
都是判断p和q两个子树的左子树和右子树是否镜像对称
1、递归
private static boolean isSymmeric(TreeNode root) {
if (root != null)
return compTree(root.left, root.right);
else
return true;
}
//比较两棵树是否镜像对称
private static boolean compTree(TreeNode p, TreeNode q){
if(p == null && q == null)
return true;
//包含具体值判断(&& p.val == q.val),不判断值不加即可
if (p != null && q != null && p.val == q.val)
return compTree(p.left, q.right) && compTree(p.right, q.left);
else
return false;
}
2、迭代(队列,中序遍历)
//递归解法
private static boolean isSymmeric(TreeNode root) {
return check(root, root);
}
private static boolean check(TreeNode p, TreeNode q) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(p);
queue.offer(q);
while (!queue.isEmpty()) {
p = queue.poll();
q = queue.poll();
if (p == null && q == null)
continue;
if ((p == null || q == null) || (p.val != q.val))//不考虑数值可以省去数值比较
return false;
queue.offer(p.left);
queue.offer(q.right);
queue.offer(p.right);
queue.offer(q.left);
}
return true;
}
main方法
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); //获取开始时间
TreeNode tree1 = new TreeNode(3);
TreeNode tree2 = new TreeNode(2);
TreeNode tree3 = new TreeNode(1, tree1, tree2);
System.out.println(isSymmeric(tree3));
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}