LeetCode刷題:Tree專題

目錄

 100. Same Tree

 101. Symmetric Tree

102. Binary Tree Level Order Traversal 

 112. Path Sum

113. Path Sum II

129. Sum Root to Leaf Numbers

 226. Invert Binary Tree

257. Binary Tree Paths


 100. Same Tree

class Solution(object):
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        
        def pre(x,y):
            if x==None and y==None:
                return True
            elif x==None or y==None:
                return False
            if x.val!=y.val:
                return False
            return pre(x.left,y.left) and pre(x.right,y.right)
        return pre(p,q)

 101. Symmetric Tree

class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """

        path=[]
        values=[]
        if not root:
            return True
        if root.left==None and root.right==None:
            return True
        def r(node,p,v):
            v.append(node.val)
            if node.left==None and node.right==None:
                path.append(p)
                values.append(v)
                return 
            if node.left:
                k=p[::]
                k.append(1)
                r(node.left,k,v[::])
            if node.right:
                k=p[::]
                k.append(-1)
                r(node.right,k,v[::])
        r(root,[],[])
        print(path,values)
        l=len(path)
        if l!=len(values) or l%2==1:
            return False
    
        def list_equal(x,y):
            if len(x)!=len(y):
                return False
            for i in range(len(x)):
                if x[i]+y[i]!=0:
                    return False
            return True
        
        for i in range(l):
            if list_equal(path[i],path[l-1-i]) and values[i]==values[l-i-1]:
                pass
            else:
                return False
        return True

 

102. Binary Tree Level Order Traversal 

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        queue=[root]
        res=[]
        if not root:
            return []
        while queue:
            # res.append()
            tmp,k=[],[]
            for i in queue:
                k.append(i.val)
                if i.left:
                    tmp.append(i.left)
                if i.right:
                    tmp.append(i.right)
            queue=tmp
            res.append(k)
        return res

 

 112. Path Sum

 

class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        
        def ge(node,i):
            if node==None:
                return False
            if i==node.val and node.left==None and node.right==None:
                return True
            return ge(node.left,i-node.val) or ge(node.right,i-node.val)
        return ge(root,sum)

 

113. Path Sum II

112稍微修改一下就好,每次傳入一個path,每次試着加入節點,如果當前path的和等於sum,且不能往下走,這時就可以append到結果裏。注意傳p時,應該傳深拷貝的值。

class Solution(object):
    def pathSum(self, root, k):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: List[List[int]]
        """
        visited=[]
        def ge(node,p):
            if node==None:
                return 
            p.append(node.val)
            if sum(p)==k and node.left==None and node.right==None:
                # print(p)
                visited.append(p)
            print(p)
            ge(node.left,p[::]) 
            ge(node.right,p[::])
        ge(root,[])
        return visited

129. Sum Root to Leaf Numbers

先遍歷得到所有的路徑,然後計算。

class Solution(object):
    def sumNumbers(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        path=[]
        def k(node,p):
            if node:
                p.append(node.val)
            else:
                return
            if node.left==None and node.right==None:
                path.append(p)
                return 
            else:
                k(node.left,p[::])
                k(node.right,p[::])
        k(root,[])
        sum=0
        for p in path:
            for i in range(1,len(p)+1):
                sum+=p[-i]*10**(i-1)
        return sum

 226. Invert Binary Tree

class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        
        def invert(node):
            if not node:
                return
            invert(node.left)
            invert(node.right)
            tmp=node.left
            node.left=node.right
            node.right=tmp
        invert(root)
        return root

257. Binary Tree Paths

class Solution(object):
    def binaryTreePaths(self, root):
        """
        :type root: TreeNode
        :rtype: List[str]
        """

        visited=[]
        def c(p):
            res=[]
            for each in p:
                x=''
                for i in each:
                    x+=str(i)+'->'
                x=x[:-2]
                res.append(x)
            return res
        def ge(node,p):
            if node==None:
                return 
            p.append(node.val)
            if node.left==None and node.right==None:
                # print(p)
                visited.append(p)
            # print(p)
            ge(node.left,p[::]) 
            ge(node.right,p[::])
        ge(root,[])
        
        return c(visited)

 

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