1. 题目描述
题目来源:力扣
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
图1. 示例
2. 题解
2.1 题解思路
要找到所有叶子节点的路径,需要把整个树的所有节点访问一遍,这里我们仍采用层次遍历访问每个节点。分析如下:
(1)遍历到1,记录:“1”
(2)由1遍历到2,在“1”的基础上记录:“1->2”
(3)由1遍历到3,在“1”的基础上记录:“1->3”
(4)由2遍历到5,在“1->2”的基础上记录:“1->2->5”
(5)3没有左右节点(叶节点),将以3为结尾的路径存入结果list—r
(6)5没有左右节点(叶节点),将以5为结尾的路径存入结果list—r
由此分析可知,在层次遍历的基础上,需要开辟一个字典,dic{node: 从根节点到该节点的路径},以方便在往深层遍历时,在父节点路径基础上找路径。算法如下:
初始化dic{node:path},r=[ ],当前层的节点current=[root],层次遍历每一层的节点
(1)若当前节点有左节点,将左节点存入下一层的节点next.append(node.left),
在dic中添加node.left的路径为dic[node.left] = dic[node] + "->"+ str(node.left.value)
(2)若当前节点有右节点,将左节点存入下一层的节点next.append(node.right),
在dic中添加node.right的路径为dic[node.left] = dic[node] + "->"+ str(node.right.value)
(3)若当前节点为叶子节点,则在结果r.append(dic[node])
current=next,直到遍历完所有层数,即current=[ ]。
代码如下,
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def set_left(self, left):
self.left = left
def set_right(self, right):
self.right = right
class Solution(object):
def binaryTreePaths(self, root):
"""
:type root: TreeNode
:rtype: List[str]
"""
r = []
if root == None:
return r
current = [root]
r_current = {root: str(root.val)}
while current != []:
tmp = []
for node in current:
if node.left != None:
r_current[node.left] = r_current[node] + "->"+ str(node.left.val)
tmp.append(node.left)
if node.right != None:
r_current[node.right] = r_current[node] + "->" + str(node.right.val)
tmp.append(node.right)
if node.left == None and node.right == None:
r.append(r_current[node])
current = tmp
return r
if __name__ == '__main__':
root = [1, 2, 2, 3, 4, 4, 3]
root = [1, 2, 3]
node1 = TreeNode(1)
node2 = TreeNode(2)
node3 = TreeNode(3)
node4 = TreeNode(4)
node5 = TreeNode(5)
node6 = TreeNode(6)
node7 = TreeNode(7)
node1.set_left(node2)
node1.set_right(node3)
node2.set_left(node4)
node4.set_left(node6)
node3.set_right(node5)
node5.set_right(node7)
sol = Solution()
r = sol.binaryTreePaths(node1)
print(r)
CSDN提醒我今天是高考啦,高考加油!高考必胜! 我在CSDN上等你们出来写代码/ciya!