在这篇文章中,我们将详细讨论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的解答,希望能对大家的学习有所帮助。