【LeetCode】101. 对称树

问题描述

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Bonus points if you could solve it both recursively and iteratively.

给定一个二叉树,检查它是否是自身的镜像(即围绕其中心对称)。
最好能递归地和迭代地解决它。

二叉树 [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

 

Python 实现

实现一:递归实现(Recursively)

思路很简单,分别从左右两个子树镜像比较节点的值是否相等。

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        
        if root == None:
            return True

        # Recursively.
        return self.isEqual(root.left, root.right)
    
    def isEqual(self, n1, n2):
        if n1 == None and n2 == None:
            return True
        elif n1 == None or n2 == None:
            return False
        elif n1.val == n2.val:
            return self.isEqual(n1.left, n2.right) and self.isEqual(n1.right, n2.left)
        else:
            return False

实现二:迭代实现(Iteratively)

迭代法稍微比较难理解,不过基本思路跟 BFS (广度优先搜索 BreadthFirstSearch)类似。对于根节点而言,左右子树分别用一个列表来储存,这两个列表当作是两个栈(stack)来使用。左列表用于处理左子树,右列表用于处理左子树(注意,这里的左右列表仅仅针对根节点而言)。

每一次比较,都是取左列表的第一个元素与右列表的最后一个元素进行比较(可以理解成是树用中序遍历表示时,取得第一个节点与最后一个节点,在这个题目里这两个节点位置是对称的)。如果两个元素的值(val)相等,则同时出栈,即移出列表,然后分别用他们的子树替代原本在列表中的位置(这一步就跟 BFS 的实现一致)。

这样,在过程只要出现两个比较节点的值不相等,或者两个比较节点不同时存在,则说明树不是对称的。

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        
        if root == None:
            return True
        
        # Iteratively.
        if root.left == None and root.right == None:
            return True
        if root.left == None or root.right == None:
            return False
        
        left_list = [root.left]
        right_list = [root.right]
        while len(left_list) > 0 and len(right_list) > 0:
            if left_list[0].val == right_list[-1].val:
                n1 = left_list.pop(0)
                n2 = right_list.pop(-1)
                
                if n1.right != None and n2.left != None:
                    left_list.insert(0, n1.right)
                    right_list.append(n2.left)
                elif n1.right == None and n2.left == None:
                    pass
                else:
                    return False
                
                if n1.left != None and n2.right != None:
                    left_list.insert(0, n1.left)
                    right_list.append(n2.right)
                elif n1.left == None and n2.right == None:
                    pass
                else:
                    return False
            else:
                return False
        return True
                

链接:https://leetcode.com/problems/symmetric-tree/

发布了46 篇原创文章 · 获赞 29 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章