LeetCode257. 二叉树上所有的路径

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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值