判断二叉树是否相等、是否为镜面树

866 阅读2分钟

前言

本文介绍如何判断一个二叉树是否相等以及是否为镜面树。

相等二叉树

现在有两个相互独立的两个二叉树pq,如果二叉树p的所有结构和q的所有结构完全相同,那么称二叉树pq为完全相等的二叉树。如果两个二叉树有任何一点不同,则这两个二叉树不相等。

现在要实现一个函数,来判断两个二叉树pq是否相等。

二叉树节点代码如下:

public class TreeNode {
   public int val;
   public TreeNode left;
   public TreeNode right;
}

思路分析

对于两个二叉树是否相等,根据定义可以得出一下结论:

  1. 如果两个二叉树都为空,则是相等的。
  2. 如果其中有一个为空,则不相等。
  3. 如果根节点值相等,左子树完全相等、右子树完全相等,则两个二叉树相等。

代码实现

可以使用递归来判断,代码如下:

public boolean isSameTree(TreeNode p, TreeNode q) {
   if (p == null ^ q == null) {
      return false;
   }
   if (p == null && q == null) {
      return true;
   }
   return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}

p == null ^ q == null 表示pq有一个为空,一个不为空。

镜面树

什么是镜面树呢?就是从二叉树中间为界限,左右完全对称,这棵树就是镜面树。下面看几个示例。

思路分析

对于一个二叉树是否位镜面树,从上面的定义可以得出一下结论:

  1. 如果只有一个节点,也符合对称结果,是镜面树。
  2. 空节点也是镜面树

所以,当我们拿到一个二叉树后,只需要判断是否为空,递归遍历他的左节点和右节点即可。

代码实现

使用递归来判断,TreeNode类的定义采用上一个示例的代码,判断镜面树代码如下:

public boolean isSymmetric(TreeNode root) {
   return isMirror(root, root);
}

public boolean isMirror(TreeNode node1, TreeNode node2) {
   if (node1 == null ^ node2 == null) {
      return false;
   }
   if (node1 == null && node2 == null) {
      return true;
   }
   return node1.val == node2.val && isMirror(node1.left, node2.right) && isMirror(node1.right, node2.left);
}

isMirror方法传进了两个一样的参数,是为了方便判断左子树和右子树节点是否相同,递归起来也方便。

总结

本文介绍如何判断一个二叉树是否相等以及是否为镜面树,在这两个示例中,都是用了递归的做法,也就是递归序,在二叉树中使用递归序,每个节点都会被经历3次访问,所以我们可以采用递归树解决很多问题,最简单的一个就是求一个二叉树的高度,这里就不展开介绍了。