题目

给你一个二叉树的根节点 root , 检查是否轴对称。

示例 1:

输入root = [1,2,2,3,4,4,3]
输出true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出false

代码详细注释

递归法:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True  # 如果根结点为空返回True(空树被认为是对称的)
        return self.compare(root.left, root.right)  # 调用compare函数比较左右子树是否对称

    def compare(self, left, right):
        if left == None and right == None:  # 如果左右子结点为空返回True
            return True
        elif left != None and right == None:  # 如果左子结点为空,右子结点为空返回False
            return False
        elif left == None and right != None:  # 如果左子结点为空,右子结点为空返回False
            return False
        elif left.val != right.val:  # 如果左右子结点的值不相等,返回False
            return False
        outside = self.compare(left.left, right.right)  # 比较左子结点的左子树和右子结点的右子树是否对称
        inside = self.compare(left.right, right.left)  # 比较左子结点的右子树和右子结点的左子树是否对称
        result = outside and inside  # 如果两个子树都对称,返回True,否则返回False
        return result

迭代法:(栈和队列可以代码思路相同,略微改动部分本题用的栈)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True  # 如果根结点为空,返回True(空树被认为是对称的)
        stack = []  # 创建一个栈,用于存储左右子结点
        stack.append(root.left)  # 将左子结点加入stack.append(root.right)  # 将右子结点加入while stack:  # 当栈不为空循环
            rightNode = stack.pop()  # 从栈中取出右子结点
            leftNode = stack.pop()  # 从栈中取出左子结点
            if not leftNode and not rightNode:  # 如果左右子结点都为空,继续下一次循环
                continue
            elif not leftNode or not rightNode or leftNode.val != rightNode.val:  # 如果左右子结点有一个为空,或者它们的值不相等,返回False
                return False
            stack.append(leftNode.left)  # 将左子结点的左子结点加入stack.append(rightNode.right)  # 将右子结点的右子结点加入stack.append(leftNode.right)  # 将左子结点的右子结点加入stack.append(rightNode.left)  # 将右子结点的左子结点加入栈
        return True  # 如果所有结点都对称,返回True

层次遍历

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True  # 如果根结点为空,返回True(空树被认为是对称的)
        
        from collections import deque
        queue = deque([root.left, root.right])  # 创建一个双端队列用于存储左右子结点
        while queue:  # 当队列不为空时循环
            size = len(queue)  # 获取当前队列长度
            if size % 2 != 0:  # 如果当前队列长度奇数说明不对称,返回False
                return False
            level = []  # 创建一个列表用于存储当前层的结点值
            for i in range(size):
                node = queue.popleft()  # 从队列中取出一个结点
                if node:  # 如果结点不为空
                    level.append(node.val)  # 将结点值加入当前层列表
                    queue.append(node.left)  # 将左子结点加入队queue.append(node.right)  # 将右子结点加入队else:  # 如果结点为空
                    level.append(None)  # 将None加入当前层列表
            if level != level[::-1]:  # 如果当前层列表不等于它的逆序列表说明不对称,返回False
                return False
        return True  # 如果所有层都对称,返回True

原文地址:https://blog.csdn.net/2301_77160836/article/details/134816344

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_45486.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注