• leetcode 257. Binary Tree Paths


    Given a binary tree, return all root-to-leaf paths.

    For example, given the following binary tree:

       1
     /   
    2     3
     
      5
    

    All root-to-leaf paths are:

    ["1->2->5", "1->3"]

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def binaryTreePaths(self, root):
            """
            :type root: TreeNode
            :rtype: List[str]
            """
            def dfs(node, path, ans):
                if not node: return
                if not node.left and not node.right: # leaf node
                    ans.append(path+str(node.val))
                    return            
                dfs(node.left, path + str(node.val)+"->", ans)
                dfs(node.right, path + str(node.val)+"->", ans)
    
            ans = []
            dfs(root, "", ans)
            return ans
    

    stack 迭代解法:

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def binaryTreePaths(self, root):
            """
            :type root: TreeNode
            :rtype: List[str]
            """
            if not root: return []
            stack = [root]
            paths = [""]
            ans = []
            while stack:
                node = stack.pop()
                path = paths.pop()
                if not node.left and not node.right:
                    ans.append(path+str(node.val))
                if node.right:
                    stack.append(node.right)
                    paths.append(path+str(node.val)+"->")
                if node.left:
                    stack.append(node.left)
                    paths.append(path+str(node.val)+"->")
            return ans
            
    

     BFS:(和dfs stack解法就差if顺序)

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def binaryTreePaths(self, root):
            """
            :type root: TreeNode
            :rtype: List[str]
            """
            if not root: return []
            q = collections.deque([root])
            paths = collections.deque([""])
            ans = []
            while q:
                node = q.popleft()
                path = paths.popleft()
                if not node.left and not node.right:
                    ans.append(path+str(node.val))
                if node.left:
                    q.append(node.left)
                    paths.append(path+str(node.val)+"->")
                if node.right:
                    q.append(node.right)
                    paths.append(path+str(node.val)+"->")
            return ans
            
    

    其他解法还有不用helper函数的:

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def binaryTreePaths(self, root):
            """
            :type root: TreeNode
            :rtype: List[str]
            """
            if not root: return []
            if not root.left and not root.right:
                return [str(root.val)]        
            paths = []
            for path in self.binaryTreePaths(root.left):
                paths.append(str(root.val) + '->' + path)
            for path in self.binaryTreePaths(root.right):
                paths.append(str(root.val) + '->' + path)
            return paths                
    

    其他人代码:

    # dfs + stack
    def binaryTreePaths1(self, root):
        if not root:
            return []
        res, stack = [], [(root, "")]
        while stack:
            node, ls = stack.pop()
            if not node.left and not node.right:
                res.append(ls+str(node.val))
            if node.right:
                stack.append((node.right, ls+str(node.val)+"->"))
            if node.left:
                stack.append((node.left, ls+str(node.val)+"->"))
        return res
        
    # bfs + queue
    def binaryTreePaths2(self, root):
        if not root:
            return []
        res, queue = [], collections.deque([(root, "")])
        while queue:
            node, ls = queue.popleft()
            if not node.left and not node.right:
                res.append(ls+str(node.val))
            if node.left:
                queue.append((node.left, ls+str(node.val)+"->"))
            if node.right:
                queue.append((node.right, ls+str(node.val)+"->"))
        return res
        
    # dfs recursively
    def binaryTreePaths(self, root):
        if not root:
            return []
        res = []
        self.dfs(root, "", res)
        return res
    
    def dfs(self, root, ls, res):
        if not root.left and not root.right:
            res.append(ls+str(root.val))
        if root.left:
            self.dfs(root.left, ls+str(root.val)+"->", res)
        if root.right:
            self.dfs(root.right, ls+str(root.val)+"->", res)
    
  • 相关阅读:
    json格式转换
    早该知道的7个JavaScript技巧
    SPFA加上SLF时判负环的条件
    HDU 4061 A Card Game
    线性筛法求素数
    STL之deque
    POJ 3219 二项式系数
    HDU 4296 Buildings
    HDU 4292 Food (成都赛区网络赛第五题,拆点网络流)
    拆点网络流(POJ3281)
  • 原文地址:https://www.cnblogs.com/bonelee/p/8831256.html
Copyright © 2020-2023  润新知