描述:

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例:

输入:

1

/ \\

2 3

\\

5

输出: ["1->2->5", "1->3"]

解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

解题思路:

递归算法的关键是要明确函数的「定义」是什么,然后相信这个定义,利用这个定义推导最终结果。

写树相关的算法,简单说就是,先搞清楚当前 root 节点该做什么,然后根据函数定义递归调用子节点,递归调用会让孩子节点做相同的事情。

二叉树题目的一个难点在于如何通过题目的要求思考出每一个节点需要做什么

按照深度遍历依次经历每一个节点,然后两个节点之间用"→"相连。

自己的解法实现

def binaryTreePaths(self, root):

if not root: return []

stack, res = [[root, ""]], []

while stack:

node, tmp = stack.pop(0)

if not node: continue

# 如果当前节点是叶子节点,将其拼装后放入最终结果集中

if node and not (node.left or node.right):

res.append(tmp + str(node.val))

continue

# 如果当前节点不是叶子节点,将其左子树和新路径放入队列中

if node.left:

stack.append([node.left, tmp + str(node.val) + "->"])

# 如果当前节点不是叶子节点,将其右子树和新路径放入队列中

if node.right:

stack.append([node.right, tmp + str(node.val) + "->"])

return res

网上比较优秀的解法

解法一

方法一:深度优先搜索 思路与算法

最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。

如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。 如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。 如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。当然,深度优先搜索也可以使用非递归的方式实现,这里不再赘述。

def binaryTreePaths2(self, root):

paths = []

def construct_paths(node, path):

if node:

path += str(node.val)

if not node.left and not node.right: # 当前节点是叶子节点

paths.append(path) # 把路径加入到答案中

else:

path += "->" # 当前节点不是叶子节点,继续递归遍历

construct_paths(node.left, path)

construct_paths(node.right, path)

construct_paths(root, '')

return paths

解法二

方法二:广度优先搜索 思路与算法

我们也可以用广度优先搜索来实现。我们维护一个队列,存储节点以及根到该节点的路径。一开始这个队列里只有根节点。在每一步迭代中,我们取出队列中的首节点,如果它是叶子节点,则将它对应的路径加入到答案中。如果它不是叶子节点,则将它的所有孩子节点加入到队列的末尾。当队列为空时广度优先搜索结束,我们即能得到答案。

def binaryTreePaths3(self, root):

from collections import deque

paths = list()

if not root: return paths

node_queue = deque([root])

path_queue = deque([str(root.val)])

while node_queue:

node = node_queue.popleft()

path = path_queue.popleft()

if not node.left and not node.right:

paths.append(path)

else:

if node.left:

node_queue.append(node.left)

path_queue.append(path + '->' + str(node.left.val))

if node.right:

node_queue.append(node.right)

path_queue.append(path + '->' + str(node.right.val))

return paths

解法三

首先初始化临时路径为空“” 之后每下降一层,就将临时路径跟当前节点的值拼接上 对于任何一个节点,要不就是叶子节点,要不就是非叶子节点,我们可以这样处理:

如果当前节点如果是叶子节点,那么拼接的内容是root.val 如果当前节点不是叶子节点,那么拼接的内容是root.val+"->"

def binaryTreePaths4(self, root):

if not root: return []

res = []

def dfs(node, tmp):

if not node: return

# 如果是叶子节点,将 root.val 拼接到临时路径中

if node and not (node.left or node.right):

res.append(tmp + str(root.val))

return

# 如果当前节点不是叶子节点,将 root.val+"->" 拼接到临时路径中

if node.left:

dfs(node.left, tmp + str(node.val) + "->")

if node.right:

dfs(node.right, tmp + str(node.val) + "->")

dfs(root, "")

return res

相关知识总结和思考

相关知识:

BFS:广度/宽度优先。其实就是从上到下,先把每一层遍历完之后再遍历一下一层。

可以使用Queue的数据结构。我们将root节点初始化进队列,通过消耗尾部,插入头部的方式来完成BFS。

二叉搜索树(BST)的特性:

若它的左子树不为空,则所有左子树上的值均小于其根节点的值

若它的右子树不为空,则所有右子树上的值均大于其根节点的值

它的左右子树也分别为二叉搜索树

递归与迭代的区别

递归:重复调用函数自身实现循环称为递归; 迭代:利用变量的原值推出新值称为迭代,或者说迭代是函数内某段代码实现循环;

leetcode二叉树 找路径_LeetCode0257: 二叉树的所有路径相关推荐

  1. LeetCode 1379. 找出克隆二叉树中的相同节点(二叉树遍历)

    1. 题目 给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target. 其中,克隆树 cloned 是原始树 original ...

  2. 【LeetCode】剑指 Offer 34. 二叉树中和为某一值的路径

    [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 文章目录 [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 package offer;import ja ...

  3. Leetcode:给一颗二叉树,找这颗二叉树最小的深度。

    给一颗二叉树,找这颗二叉树最小的深度.最小深度是从根节点到最近的叶节点的最短路径上的节点数. 思路://采用广度优先搜索,或者层序遍历,找到的第一个叶节点的深度即是最浅. 一定记得维护一个last指针 ...

  4. 四 . LeetCode标签刷题——树/二叉树(一) 算法部分

    各种二叉树的介绍汇总: 二叉树:最多有两棵子树的树被称为二叉树 满二叉树:二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上 完全二叉树:如果一个二叉树与满二叉树前m个节点的结构相同,这样的二 ...

  5. 求二叉树根节点到指定节点的路径

    算法 求二叉树根节点到指定节点的路径 @author:Jingdai @date:2020.11.05 题目描述 给你一个棵二叉树,再给你一个指定的节点,求根节点到指定节点的路径. 如图,比如让你求到 ...

  6. 数据结构与算法-- 二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径.从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径. 我们用二叉树节点的定义沿用之前文章中 ...

  7. 剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值 ...

  8. [c++]查找二叉树根节点到任意结点的路径

    今天在做leetcode236时受到启发,怎么求二叉树根节点到二叉树任意结点(该节点在二叉树中存在)的路径?当然,前提是二叉树各节点的值不相等. 示例 输入:root = [3,5,1,6,2,0,8 ...

  9. 剑指offer:面试题34. 二叉树中和为某一值的路径

    题目:二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和  ...

最新文章

  1. vue中使用baidushare分享到微信无法显示bug解决方案
  2. 解决windows下tomcat端口被占用
  3. dim private public static_C++ 强制类型转换操作符 static_cast
  4. iphone电池怎么保养_蓄电池在ups系统中应该怎么维护保养?
  5. Asp.NetCore依赖注入和管道方式的异常处理及日志记录
  6. 20162314 《Program Design Data Structures》Learning Summary Of The First Week
  7. 红橙Darren视频笔记 ViewGroup事件分发分析 基于API27
  8. 解决xgboost报错XGBoostError: XGBoost Library (libxgboost.dylib) could not be loaded
  9. jq实现ajax访问服务器,jQuery实战读书笔记(第八章 使用 Ajax 与服务器通信)
  10. ntko php,NTKO OFFICE文档控件
  11. 喜马拉雅音频下载工具 - xmlyfetcher
  12. python win7 安装失败 Service Pack 1
  13. 自己开发了一个JsonViewer工具--FrogJson
  14. Bit-M Accelerator全新上线
  15. 电子课件html咋阅读,html教学课件
  16. top命令的原理是什么
  17. ROCm 5.4.3 在 ubuntu 20.04 上安装并运行示例
  18. 历时5年打造开源芯片生态的一块拼图——SERVE平台
  19. 市场经济下的“按劳分配”
  20. Linux系统解决OSDLyrics搜索显示的中文歌词名乱码问题

热门文章

  1. GP学习(四)—Running a geoprocessing tool using background geoprocessing
  2. linux中的进程有哪三种基本状态,Linux下的进程有哪三种状态?()
  3. kafka spark java_spark streaming中维护kafka偏移量到外部介质
  4. mysql索引 删除和创建_mysql索引和唯一索引的创建和删除
  5. 解决 jupyter-lab 安装插件后无法使用的问题(重新安装插件无法使用)
  6. pandas缺失值处理
  7. selenium使用浏览器隐私模式加载网站
  8. vm linux数据恢复,VMWARE虚拟机数据恢复
  9. mysql limit分页知乎_头发一天天的掉,你知道MySQL的Limit有性能问题吗?
  10. ios开发读取剪切板的内容_ios开发读取剪切板的内容_苹果隐私问题堪忧!多个iOS应用未经许可读取剪贴板......