【leetcode】101. 对称二叉树
对称二叉树
- 题目
- 题解
- 1. 递归
- 2. 递归
- 解释
- 1. 对称
- 2. 非对称
题目
101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
题解
1. 递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""if not root:return Truereturn self.compare(root.left, root.right)def compare(self, left, right):#首先排除空节点的情况if left == None and right != None: return Falseelif left != None and right == None: return Falseelif left == None and right == None: return True#排除了空节点,再排除数值不相同的情况elif left.val != right.val: return False#此时就是:左右节点都不为空,且数值相同的情况#此时才做递归,做下一层的判断outside = self.compare(left.left, right.right) #左子树:左、 右子树:右inside = self.compare(left.right, right.left) #左子树:右、 右子树:左isSame = outside and inside #左子树:中、 右子树:中 (逻辑处理)return isSame
来自:代码随想录
2. 递归
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""if not root:return Truedef dfs(left, right):# 递归的终止条件是两个节点都为空# 或者两个节点中有一个为空# 或者两个节点的值不相等if not (left or right):return Trueif not (left and right):return Falseif left.val!=right.val:return False# 外侧和内侧return dfs(left.left, right.right) and dfs(left.right, right.left)return dfs(root.left, root.right)
解释
1. 对称
假设有一个二叉树如下:
1/ \2 2/ \ / \
3 4 4 3
步骤 1: 初始调用
isSymmetric 方法首先检查根节点 1 是否为空。根节点不为空,所以调用 dfs(root.left, root.right),即检查 root.left 和 root.right 是否对称。root.left 和 root.right 都是值为 2 的节点。
步骤 2: 递归判断
对于 left 节点和 right 节点(值为 2),检查它们的左右子树是否对称。
比较 left.left 和 right.right(即 3 和 3)。它们值相等,继续递归。
比较 left.right 和 right.left(即 4 和 4)。它们值相等,继续递归。
步骤 3: 递归继续
递归深入到 left.left 和 right.right(3 和 3),以及 left.right 和 right.left(4 和 4)。它们的值相等,因此返回 True。
步骤 4: 完成判断
由于所有的对称条件都满足,最终返回 True,表示该二叉树是对称的。
2. 非对称
考虑以下不对称的二叉树:
1/ \2 2\ \3 3
步骤 1: 初始调用
isSymmetric 方法检查根节点 1,然后调用 dfs(root.left, root.right),即检查 root.left 和 root.right 是否对称。
root.left 和 root.right 都是值为 2 的节点。
步骤 2: 递归判断
对于 left 和 right(值为 2),继续检查它们的左右子树。
比较 left.left 和 right.right,但是 left.left 是空的,right.right 是值为 3 的节点,返回 False。
步骤 3: 完成判断
由于递归过程中发现不对称,最终返回 False,表示该二叉树不是对称的。