zoukankan      html  css  js  c++  java
  • 153-101. 对称二叉树

    给定一个二叉树,检查它是否是镜像对称的。(随便看看吧,这个题真滴难-只有最后两个是对的前面的都不是对的)
    # Definition for a binary tree node.
    class TreeNode(object):
        def __init__(self, val=None, left=None, right=None):
            self.val = val
            self.left = left
            self.right = right
    
    
    class Solution(object):
        def isSymmetric1(self, root):
            """这个方法适合满二叉树,获取是空节点补TreeNode()的树
            :type root: TreeNode
            :rtype: bool
            """
            temp = root
            stack = list()
            temp_list = []   # 几率元素个数
            while temp or stack:
                while temp:
    
                    if not temp.right and temp.left:
                        temp.right = TreeNode(None)
                    if temp.right and not temp.left:
                        temp.left = TreeNode(None)
    
                    stack.append(temp)
                    temp = temp.left
    
                cur = stack.pop()
                temp_list.append(cur.val)
                temp = cur.right
    
            return temp_list == temp_list[::-1]
    
        def isSymmetric2(self, root):
            """这个方法适合满二叉树,获取是空节点补TreeNode()的树
            :type root: TreeNode
            :rtype: bool
            """
            return self.preSearch(root) == self.postSearch(root)
    
        def preSearch1(self, root):
            temp = root
            stack = list()
            temp_list = []   # 几率元素个数
            while temp or stack:
                while temp:
                    temp_list.append(temp.val)
                    stack.append(temp)
                    temp = temp.left
                cur = stack.pop()
                temp = cur.right
            return temp_list
    
        def postSearch1(self, root):
            temp = root
            stack = list()
            temp_list = []   # 几率元素个数
            while temp or stack:
                while temp:
                    temp_list.append(temp.val)
                    stack.append(temp)
                    temp = temp.right
                cur = stack.pop()
                temp = cur.left
            return temp_list
    
        def add_node(self, root):
            if not root.right and root.left:
                root.right = TreeNode()
    
            if not root.left and root.right:
                root.left = TreeNode()
    
            if root.left:
                self.add_node(root.left)
            if root.right:
                self.add_node(root.right)
    
        def preSearch(self, root):
            print(root.val)
            if root.left:
                self.preSearch(root.left)
    
            if root.right:
                self.preSearch(root.right)
    
        def midSearch(self, root):
            if root.left:
                self.midSearch(root.left)
    
            print(root.val)
    
            if root.right:
                self.midSearch(root.right)
    
        def postSearch(self, root):
            if root.left:
                self.postSearch(root.left)
    
            if root.right:
                self.postSearch(root.right)
    
            print(root.val)
    
        def isSymmetric3(self, root):
            """
            :type root: TreeNode
            :rtype: bool
            """
            return self.check(root, root)
    
        def check(self, left, right):
            if not left and not right:
                return True
            if not left or not right:
                return False
    
            return left.val == left.val and self.check(left.left, right.right) and self.check(left.right, right.left)
    
        def isSymmetric(self, root):
            """
            :type root: TreeNode
            :rtype: bool
            """
            queue = list()
            queue.append(root)
            queue.append(root)
            while queue:
                left = queue.pop()
                right = queue.pop()
    
                if not left and not right:
                    continue
    
                if (not left or not right) or (left.val != right.val):
                    return False
    
                queue.append(left.left)
                queue.append(right.right)
    
                queue.append(left.right)
                queue.append(right.left)
    
            return True
    
    
    if __name__ == '__main__':
        root = TreeNode(1)
    
        n1 = TreeNode(2)
        n2 = TreeNode(2)
    
        n3 = TreeNode(3)
        # n4 = TreeNode(4)
    
        n5 = TreeNode(3)
        # n6 = TreeNode(4)
    
        n1.left = n3
        # n1.right = n4
    
        n2.left = n5
        # n2.right = n6
    
        root.left = n1
        root.right = n2
    
        s1 = Solution()
        print(s1.isSymmetric(root))
    
  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/14313317.html
Copyright © 2011-2022 走看看