检查一个二叉树是否为左右子树上的镜像。

128 阅读2分钟

检查一个二叉树是否为左右子树上的镜像是二叉树遍历的常见问题。这个问题的解决可以通过递归算法实现。在解决这个问题之前,我们需要先了解什么是二叉树的镜像。

一个二叉树的镜像是指将这个二叉树的左右子树交换位置所得到的新树。例如,下图所示的二叉树及其镜像:

markdownCopy code
     1                    1
   /   \                /   \
  2     3              3     2
 / \   / \            / \   / \
4   5 6   7          7   6 5   4

接下来,我们考虑如何检查一个二叉树是否为左右子树上的镜像。对于一个给定的二叉树,我们可以通过以下步骤来检查它是否为左右子树上的镜像:

  1. 检查根节点是否为空。如果为空,则返回 true。
  2. 比较根节点的左右子节点是否相等。如果不相等,则返回 false。
  3. 递归地检查左子树是否为右子树的镜像,右子树是否为左子树的镜像。具体来说,对于左子树和右子树,我们将它们的左子树和右子树分别递归地进行比较,将它们的右子树和左子树分别递归地进行比较。如果左子树和右子树、右子树和左子树都是镜像,则返回 true。

下面是用 Python 实现的检查二叉树是否为左右子树上的镜像的代码:

pythonCopy code
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
def is_mirror(root: TreeNode) -> bool:
    if not root:
        return True
    
    def helper(left: TreeNode, right: TreeNode) -> bool:
        if not left and not right:
            return True
        if not left or not right or left.val != right.val:
            return False
        return helper(left.left, right.right) and helper(left.right, right.left)
    
    return helper(root.left, root.right)

在上述代码中,我们定义了一个 TreeNode 类来表示二叉树的节点。is_mirror 函数接受一个 TreeNode 类型的参数 root,表示二叉树的根节点,它返回一个布尔值,表示这个二叉树是否为左右子树上的镜像。具体实现中,我们使用 helper 函数来递归地比较左右子树是否为镜像。如果左右子树都为空,说明比较结束,返回 True;如果左右子树有一个为空,说明不是镜像,返回 False;