《Leedcode》101、对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

思路:关于树的问题,尽量用递归的思想去解决。因为树的定义也是递归定义的。何为镜像对称呢?就是这个树的左子树和右子树的节点都是对称的。①递归法:因此可以把这个树copy一份,变成两个树,然后观察这两个树的左子树和右子树是不是对称的,也就是右子树的左节点等于左子树的右节点,这样递归的判断下去。最终就可以判断出来这棵树是不是镜像对称。②迭代法:总体思路和递归相差不是太大,定义一个队列,然后一次加入一对节点,然后去判断节点的值是不是相同。

1、递归法

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

class Solution:
    #定义一个递归函数判断左右子树是不是镜面对称
    def isSymmetricJudge(self,left,right):
        #如果左右子树都是空的,那么就是镜面对称
        if left is None and right is None:
            return True
        #如果左右子树有一个子树是空,另一个非空,那肯定不是镜面对称
        if left is None or right is  None:
            return False
        #接下来就详细的判断,节点的值必须相同,且递归的判断左节点的左和右节点的右;
        #左节点的右和右节点的左相等
        return left.val==right.val and self.isSymmetricJudge(left.left,right.right) and self.isSymmetricJudge(left.right,right.left)
    def isSymmetric(self, root: TreeNode) -> bool:
        #如果树为空,就是对称树
        if not root:
            return True
        else:
            return self.isSymmetricJudge(root,root)

2、迭代法

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

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        #定义一个队列
        queue = collections.deque()
        #加入一对根节点
        queue.append((root, root))
        while queue:
            #从队列中取出元素
            left, right = queue.popleft()
            if not left and not right:
                continue
            if not left or not right:
                return False
            if left.val != right.val:
                return False
            #加入左子树的左节点和右子树的右节点
            #加入右子树的左节点和左子树的右节点
            queue.append((left.left, right.right))
            queue.append((left.right, right.left))
        return True

总结:处理二叉树的问题尽量用递归,但是递归往往和迭代是分不开的,在进行迭代时多用队列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章