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)
标签:node,Paths,right,val,Binary,self,Tree,str,root From: https://blog.51cto.com/u_11908275/6380968