返回
LeetCode 101:对称二叉树
IOS
2023-09-07 09:22:49
目录
给定一个二叉树的根节点,判断它是否为对称的。
一个二叉树被称为对称的,如果它左子树的镜像和右子树相同。例如,以下二叉树是对称的:
1
/ \
2 2
/ \ / \
3 4 4 3
而以下二叉树不是对称的:
1
/ \
2 2
/ \ \
3 4 3
解决这个问题的一个直观方法是使用递归。我们可以将对称检查分解为两个子问题:
- 检查左子树是否镜像对称右子树。
- 检查左子树的左子树是否镜像对称右子树的右子树。
- 检查左子树的右子树是否镜像对称右子树的左子树。
如果上述所有子问题都成立,则该二叉树是对称的。否则,它是不对称的。
func isSymmetric(_ root: TreeNode?) -> Bool {
return isMirror(root?.left, root?.right)
}
func isMirror(_ left: TreeNode?, _ right: TreeNode?) -> Bool {
if left == nil && right == nil {
return true
} else if left == nil || right == nil {
return false
} else if left!.val != right!.val {
return false
}
return isMirror(left?.left, right?.right) && isMirror(left?.right, right?.left)
}
该算法的时间复杂度为 O(N),其中 N 是树中的节点数。这是因为我们遍历了树中的每个节点一次。
空间复杂度为 O(H),其中 H 是树的高度。这是因为递归调用堆栈中的节点数最多为 H。
我们可以扩展这个算法来解决以下相关问题:
- 判断一棵树是否是对称的,即使它的左右子树不同。
- 判断一棵树是否是对称的,即使它的左右子树的结构不同。
- 判断一棵树是否是对称的,即使它的左右子树的值不同。
- 给定一个二叉树的根节点,找出它最大的对称子树。
- 给定一个二叉树的根节点,判断它是否可以通过镜像其右子树来使其对称。
- 给定一个二叉树的根节点,找出它所有对称子树的根节点。