判断二叉树是否轴对称

434 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情 >>

判断二叉树是否轴对称

题目设定

对于给定的一个二叉树,需要用算法来判断它是否是轴对称,如果是轴对称就返回 true, 如果不是轴对称,则返回false。

题目分析

题目的意思是要判断一下二叉树的左右两边的结点是否关于根节点往下的竖线轴对称。

很明显,这样的判断只能一层一层来判断的,但凡其中一层不满足对称的要求,则整个二叉树都不满足轴对称的要求了,直接返回fasle。

具体算法实现

递归终止条件:

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

以上的代码一共考虑了四种情况:

(注意:以下四种情况都是二叉树不满足轴对称的情况;在这些情况下,其他事情都不用考虑,直接返回false即可,因为一旦出现下面四种情况,那么该二叉树肯定不是轴对称的二叉树)

  1. 左节点为空,右节点不为空
  2. 左节点不为空,右节点为空
  3. 左右节点都为空
  4. 左右节点不为空,但是左右节点的结点值不同

递归函数调用:

// 比较二叉树外侧
boolean outside = compare(left.left, right.right);
// 比较二叉树内侧
boolean inside = compare(left.right, right.left);

上面的代码就是利用递归函数来不断地进行比较,从外到内进行比较。

说比较外侧、比较内侧,可能有点难以想象,但是我们可以这么理解:

在当前层内,最左边的结点和最右边的结点进行比较,看他们的值是否相等;如果相等,则左边第二个结点和右边第二个结点进行比较,还是比较结点值是否相等。。。;其他情况依次类推即可。

经过了以上的一步步分析,相信大家都对这种算法实现有了一定的理解,接下来我们一起来学习一下,算法代码的具体实现:

首先看到的是递归函数的实现:

 private boolean compare(TreeNode left, TreeNode right) {
​
            if (left == null && right != null) {
                return false;
            }
            if (left != null && right == null) {
                return false;
            }
​
            if (left == null && right == null) {
                return true;
            }
            if (left.val != right.val) {
                return false;
            }
            // 比较二叉树外侧
            boolean outside = compare(left.left, right.right);
            // 比较二叉树内侧
            boolean inside = compare(left.right, right.left);
            /**
             * 后序递归遍历后,回到根节点将获得左右子树的处理结果
             */
            return outside && inside;
     }

接下来,我们看看调用函数的实现:

public boolean isSymmetric(TreeNode root) {
         return compare(root.left, root.right);
}

总结:

本文介绍了一种比较好理解的判断二叉树是否是轴对称的算法方法——递归函数判断。

它的主要实现思路如下:

二叉树是一个很适合使用递归方法的一种数据结构,就像这次判断二叉树是否是轴对称一样。

它是先判断底层的叶子结点是否对称,慢慢地不断回溯,从而实现来由结点是否对称的判断,演变成左右子树是否关于根节点往下的竖线轴对称的情况。