力扣题目链接
给定一个二叉树,检查它是否是镜像对称的。
示例:
上述的二叉树就是对称的。
在做二叉树题目时,最重要的是你要找到题目中的二叉树是怎么遍历的。本题中要检查二叉树是否镜像对称,这就不是单独判断某个父节点的左右节点了,而是要判断原始根节点的左右两棵子树是不是镜像对称的。
那么该题中,我们应该怎么遍历呢?发现可以从外侧慢慢往里靠,判断其是否对称,如图:
我们结合代码详细解释解题思路,递归法完整代码如下:
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
if not root:
return True
return self.compare(root.left, root.right)
def compare(self, left, right):
#首先排除空节点的情况
if left == None and right != None: return False
elif left != None and right == None: return False
elif 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
首先判断有没有根节点,然后有根节点的情况下return到self.compare(root.left, root.right),其中compare是自定义的一个函数,判断根节点左右子树,接着我们看关键代码,即自定义的compare函数。
首先左空右不空或者左不空右空,都return到False,在结构上就已经不对称了。接着在结构对称的基础上判断左右两点数值是否相等,不相等也return到False。
开始递归,首先是树的外层outside = self.compare(left.left, right.right),在示例中就是:
左结点的左边,右节点的右边分别作为left和right,这里只有三次,所以递归一次就到树的底部了,如果树再长一点,则是:
反正就是这个意思,一层一层递归,直到到达树的最底层,判断不停递归的最外层两个节点。开始一层一层往上往里进行递归判断内测的节点是否相等。顺序如下:
直到最后完成所有递归,你可以这样理解,树一层一层往下,我只取相对最左侧和相对最右侧的节点直到最底层。比如4和4,最底层的outside = self.compare(left.left, right.right) 完成后开始往上走,左侧的父节点3还有右节点5,右侧的父节点3还有左节点5,进入inside = self.compare(left.right, right.left),判断后再往上走,发现和3同层的还有节点6,开始进入6子树,依旧是outside = self.compare(left.left, right.right)直到底层。持续递归直到到达根节点1。
isSame = outside and inside定义isSame是outside和inside同时为True时,ruturn到True。总结来说是路线从上往下到达最底层后再往上往里填满整个二叉树。
而《代码随想录》中的迭代法是从上往下一层一层判断,理解了上面的递归法同样也就理解了迭代法的思路,大家可以自行去理解一下。