一文详解二叉树是否对称

1 前言 

LeetCode连接

输入一个树的根节点,然后输出一个布尔值,如果树是对称的返回true,否则为false

1.1 解析

我们判断树是对称的步骤是什么呢?

【第一步】如果根节点的左子节点不为null,右子节点为null。则不是对称。

【第二步】如果根节点的左子节点为null,右子节点不为null。则不是对称。

【第三步】如果根节点的左子节点为null,右子节点为null。则是对称。

【第四步】如果根节点的左子节点不为null,右子节点不为null。但是他们的值不相等,则不是对称

if (left != null && right == null) {
            return false;
        } else if (left == null && right != null) {
            return false;
        } else if (left == null && right == null) {
            return true;
        } else {
            if (left.value != right.value) {
                return false;
            }
        }

【第五步】递归

return (compare(left.right, right.left) && compare(left.left, right.right));

 1.2代码实现

package cn.msf.tree;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Queue;

/**
 * @author : msf
 * @date : 2022/12/7
 */
public class IsSymmetric {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        TreeNode node1 = new TreeNode(2);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(4);
        TreeNode node6 = new TreeNode(3);

        root.left = node1;
        root.right = node2;
        node1.left = node3;
        node1.right = node4;
        node2.left = node5;
        node2.right = node6;
        IsSymmetric is = new IsSymmetric();
        boolean symmetric = is.isSymmetric(root);
        System.out.println("该树是对称的嘛?" + symmetric);
    }

    public boolean isSymmetric(TreeNode treeNode) {
        if (treeNode == null) {
            return true;
        }
        return compare(treeNode.left, treeNode.right);
    }

    private boolean compare(TreeNode left, TreeNode right) {
        if (left != null && right == null) {
            return false;
        } else if (left == null && right != null) {
            return false;
        } else if (left == null && right == null) {
            return true;
        } else {
            if (left.value != right.value) {
                return false;
            }
        }
        // 由于函数的结果是布尔值,只有全为真是才是真。
        return (compare(left.right, right.left) && compare(left.left, right.right));
    }
}

其中的TreeNode实现

package cn.msf.tree;

/**
 * @author : msf
 * @date : 2022/12/2
 */
public class TreeNode{
    int value;
    TreeNode left;
    TreeNode right;

    public TreeNode() {
    }

    public TreeNode(int value) {
        this.value = value;
    }

    public TreeNode(int value, TreeNode left, TreeNode right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }
}

上述代码运行结果如下图所示:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兜兜转转m

一毛钱助力博主实现愿望

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值