Java实现判断二叉树是否镜像对称

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");    //输出程序运行时间
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值