• 二叉树 | 所有路径 | 迭代&回溯 | 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
  • 相关阅读:
    基于开源方案构建统一的文件在线预览与office协同编辑平台的架构与实现历程
    windows上后台启动java进程方式设置
    java基础05
    MIT的智慧,利用深度学习来解决了交通堵塞
    评论功能的选择难题:数据结构如何选定?
    冒泡排序、插入排序、选择排序和快速排序的原理
    APOLLO UDACITY自动驾驶课程笔记——感知、预测
    Electron入门
    CUDA和cuDNN安装配置
    第六部分--模板
  • 原文地址:https://blog.csdn.net/qq_44250700/article/details/126282900