前言
本文介绍如何判断一个二叉树是否相等以及是否为镜面树。
相等二叉树
现在有两个相互独立的两个二叉树p和q,如果二叉树p的所有结构和q的所有结构完全相同,那么称二叉树p和q为完全相等的二叉树。如果两个二叉树有任何一点不同,则这两个二叉树不相等。
现在要实现一个函数,来判断两个二叉树p和q是否相等。
二叉树节点代码如下:
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
}
思路分析
对于两个二叉树是否相等,根据定义可以得出一下结论:
- 如果两个二叉树都为空,则是相等的。
- 如果其中有一个为空,则不相等。
- 如果根节点值相等,左子树完全相等、右子树完全相等,则两个二叉树相等。
代码实现
可以使用递归来判断,代码如下:
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 表示p和q有一个为空,一个不为空。
镜面树
什么是镜面树呢?就是从二叉树中间为界限,左右完全对称,这棵树就是镜面树。下面看几个示例。
思路分析
对于一个二叉树是否位镜面树,从上面的定义可以得出一下结论:
- 如果只有一个节点,也符合对称结果,是镜面树。
- 空节点也是镜面树
所以,当我们拿到一个二叉树后,只需要判断是否为空,递归遍历他的左节点和右节点即可。
代码实现
使用递归来判断,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次访问,所以我们可以采用递归树解决很多问题,最简单的一个就是求一个二叉树的高度,这里就不展开介绍了。