首页 > 编程知识 正文

Python每日一题002:对称二叉树

时间:2023-11-19 03:03:14 阅读:288584 作者:ERZZ

在这篇文章中,我们将详细讨论Python每日一题002,即如何判断一个二叉树是否对称。

一、递归解法

首先,对于一个二叉树的对称性,我们可以采用递归的方式来解决。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def isSymmetric(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)

在递归的过程中,我们比较当前节点的左右子节点的值是否相等,并且递归地比较左子节点的左子节点与右子节点的右子节点、左子节点的右子节点与右子节点的左子节点。

递归解法的时间复杂度为O(n),其中n是二叉树的节点个数。

二、迭代解法

除了递归解法,我们还可以使用迭代的方式来判断二叉树的对称性。

def isSymmetric(root: TreeNode) -> bool:
    if not root:
        return True
    
    stack = [(root.left, root.right)]
    while stack:
        left, right = stack.pop()
        if not left and not right:
            continue
        if not left or not right or left.val != right.val:
            return False
        stack.append((left.left, right.right))
        stack.append((left.right, right.left))
    
    return True

迭代解法使用了一个栈来模拟递归的过程。我们首先入栈根节点的左右子节点,然后每次从栈中弹出一对节点进行比较,并将它们的左右子节点入栈。

迭代解法的时间复杂度也为O(n),其中n是二叉树的节点个数。

三、测试样例

下面是一些测试样例:

# 对称二叉树
root1 = TreeNode(1)
root1.left = TreeNode(2)
root1.right = TreeNode(2)
root1.left.left = TreeNode(3)
root1.left.right = TreeNode(4)
root1.right.left = TreeNode(4)
root1.right.right = TreeNode(3)
print(isSymmetric(root1))  # 输出True

# 非对称二叉树
root2 = TreeNode(1)
root2.left = TreeNode(2)
root2.right = TreeNode(2)
root2.left.right = TreeNode(3)
root2.right.right = TreeNode(3)
print(isSymmetric(root2))  # 输出False

运行结果应该与注释中的输出一致。

四、总结

在本文中,我们学习了如何判断一个二叉树是否对称。通过递归或迭代的方式,我们可以有效地解决这个问题。同时,我们也给出了一些测试样例来验证我们的解决方案。

以上就是Python每日一题002的解答,希望能对大家的学习有所帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。