• 二叉树 | 所有路径 | 迭代&回溯 | leecode刷题笔记


    跟随carl代码随想录刷题
    语言:python


    257. 二叉树的所有路径

    题目:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点叶子节点的路径。
    叶子节点 是指没有子节点的节点。
    👉示例1:
    在这里插入图片描述
    输入:root = [1,2,3,null,5]
    输出:[“1->2->5”,“1->3”]
    👉示例 2:
    输入:root = [1]
    输出:[“1”]

    题目分析

    递归回溯是一家的
    递归回溯是一一对应的,一定要写在一起
    在这里插入图片描述

    完整代码如下

    递归+隐形回溯

    所谓隐形回溯是指:每次递归的path是以path + '->'形式给出的,而不是path = path+ '->',path并没有被加上'->'

    注:如果想明确写出回溯,可以这样:

    path += '->'
    ...
    path.pop_back();  # 回溯
    
    • 1
    • 2
    • 3

    请添加图片描述

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
            path = ''
            result = []
            if not root:
                return result
            
            self.traversal(root, path, result)
            return result
        def traversal(self, cur, path:str, result:list[str]) ->None:
            path += str(cur.val)
    
            # 如果当前节点是叶子节点,直接输出
            if not cur.left and not cur.right:
                result.append(path)
    
            if cur.left:
                # + '->'是隐形回溯
                self.traversal(cur.left, path + '->', result)
    
            if cur.right:
                self.traversal(cur.right, path + '->', result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    迭代法

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
            stack, path_st, result = deque([root]), deque(), []
            path_st.append(str(root.val))
    
            while stack:
                cur = stack.pop()
                path = path_st.pop()
                # 如果当前节点是叶子节点,就将路径添加到结果中
                if not cur.left and not cur.right:
                    result.append(path)
                if cur.right:
                    stack.append(cur.right)
                    path_st.append(path + '->' + str(cur.right.val))
                if cur.left:
                    stack.append(cur.left)
                    path_st.append(path + '->' + str(cur.left.val))
    
            return result
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    LeetCode 热题 100 | 图论(三)
    (十二)STM32——NVIC中断优先级管理
    【Linux】一个小故事让你秒懂shell外壳程序
    【CSDN|每日一练】小艺读书
    OpenCV-Python快速入门(二):图像基础
    自我介绍思考
    Linux网络编程- ether_header & iphdr & tcphdr
    Vue_Bug NPM下载速度过慢
    全栈开发对于物联网至关重要
    用于物体识别和跟踪的下游任务自监督学习-2-(计算机视觉中的距离度量+损失函数)
  • 原文地址:https://blog.csdn.net/qq_44250700/article/details/126282900