📜  数据结构 |杂项 |问题 6(1)

📅  最后修改于: 2023-12-03 15:26:09.038000             🧑  作者: Mango

数据结构 | 杂项 | 问题 6

介绍

本文将介绍一个常见的问题:如何判断一个二叉树是否是对称的,即它的左子树和右子树是否对称。

解决方法
递归法

递归地判断两棵树是否对称:

  1. 如果两个节点的值不相等,返回 false。
  2. 如果左节点的左子树与右节点的右子树不对称,返回 false。
  3. 如果左节点的右子树与右节点的左子树不对称,返回 false。
  4. 如果以上条件都不满足,返回 true。

具体实现代码:

def is_symmetric(root):
    if root is None:
        return True

    def helper(node1, node2):
        if node1 is None and node2 is None:
            return True
        if node1 is None or node2 is None:
            return False
        if node1.val != node2.val:
            return False
        return helper(node1.left, node2.right) and helper(node1.right, node2.left)

    return helper(root.left, root.right)
迭代法

使用队列进行迭代:

  1. 将根节点的左右节点入队;
  2. 每次从队列中取出两个节点,判断它们的值是否相等;
  3. 如果它们的值不相等,或一个节点为空一个非空,返回 false;
  4. 将左节点的左子节点和右节点的右子节点入队;
  5. 将左节点的右子节点和右节点的左子节点入队;
  6. 重复步骤 2 到步骤 5,直到队列为空。

具体实现代码:

def is_symmetric(root):
    if root is None:
        return True

    queue = deque([root.left, root.right])
    while queue:
        node1 = queue.popleft()
        node2 = queue.popleft()
        if node1 is None and node2 is None:
            continue
        if node1 is None or node2 is None:
            return False
        if node1.val != node2.val:
            return False
        queue.append(node1.left)
        queue.append(node2.right)
        queue.append(node1.right)
        queue.append(node2.left)

    return True
总结

本文介绍了如何判断一个二叉树是否对称,提供了递归和迭代两种解决方法。其中,递归方法需要编写一个递归的帮助函数,而迭代方法则需要使用队列进行迭代。