二叉树路径遍历

  • 简述

    • 比较基础的一个DFS的题目,但是确实很多难题的模板。LeetCode很多二叉树的题本质上就是这个路径遍历。
    • 本题为了输出路径,使用DFS的经典结构栈完成。
  • 问题描述
    • 给定一个二叉树结构(通过类定义节点及父子关系),输出所有到达叶子节点的路径。(二叉树只是标准二叉树)
  • 问题分析
    • 明显的遍历题,那么是何种遍历呢?显然,优先的是到达叶子节点而不是辐射更大的范围,这是一个深度优先遍历,遍历完了一个方向找不到路了,则回头遍历其他路径。
    • 假设对上图的二叉树路径遍历。
      • 我们利用一个stack,里面存放一个Node对象和到这个节点为止的路径(不包括这个节点自己的值)。同时用一个列表res记录所有的路径。
      • 只要栈内还有元素就一直遍历。
        • 每次得到栈顶元素并将其出栈,得到这个Node对象及其路径字符串ls。

          • 若该节点的左右孩子均不存在,这个节点是一个叶子节点。那么将之前的路径加上当前节点的值,作为结果添加到结果集res中。
          • 若该节点的左孩子存在,那么其必然不是孩子节点,将左孩子及加上当前节点值的路径ls入栈。
          • 若该节点的右孩子存在,同上。
      • 当栈空时退出循环,此时res存着所有路径。
  • 代码
    •   # -*-coding:utf-8-*-class Node(object):def __init__(self, x, y, z):self.val = xself.left = yself.right = zdef search(root):if not root:return []res, stack = [], [(root, "")]while stack:node, ls = stack.pop()if not node.left and not node.right:res.append(ls + str(node.val))if node.left:stack.append((node.left, ls + str(node.val) + "--->"))if node.right:stack.append((node.right, ls + str(node.val) + "--->"))return resif __name__ == '__main__':d = Node(0, None, None)e = Node(1, None, None)f = Node(1, None, None)b = Node(1, None, d)c = Node(1, e, f)a = Node(0, b, c)print(search(a))
  • 运行结果
  • 补充说明
    • 具体代码可以查看我的Github,欢迎Star或者Fork
    • 参考书《你也能看得懂的Python算法书》

深度优先遍历算法-03二叉树路径遍历问题相关推荐

  1. 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...

    二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...

  2. Python算法系列—深度优先遍历算法【二叉树】

    深度优先遍历算法之二叉树 一.什么是深度优先遍历 二.二叉树 1. 二叉树简介 2.二叉树类型 3.二叉树相关术语 4. 二叉树的节点代码 5. 二叉树遍历顺序 6.深度优先遍历和广度优先遍历 三.面 ...

  3. 二叉树的层序遍历算法 + 打印二叉树所有最左边的元素(算法)

    二叉树的层序遍历算法 + 打印二叉树所有最左边的元素(算法) 层序遍历 /** * 树结构定义 */ private static class BinaryNode<T> {BinaryN ...

  4. 二叉树遍历算法之一:前序遍历

    递归实现前序遍历 二叉树的前序遍历是指从根节点出发,按照先根节点,再左子树,后右子树的方法遍历二叉树中的所有节点,使得每个节点都被访问一次. 当调用遍历算法的时候前序遍历的具体过程如下: 首先访问根节 ...

  5. 数据结构——二叉树的递归遍历算法与非递归遍历算法+层次遍历算法

    (文章篇幅有点长,二叉树的递归遍历算法不作详细分析,但是二叉树的非递归遍历算法和层次遍历算法都有非常详细的分析过程,记得往下翻哦!) 二叉树的递归遍历算法实现 我们首先用递归的方法先序遍历创建这样一棵 ...

  6. 二叉树前序中序后续线索树_二叉树的先序,中序,后序遍历以及线索二叉树的遍历...

    二叉树的先序,中序,后序遍历以及线索二叉树的遍历 (2008-05-04 17:52:49) 标签: 杂谈 C++ 二叉树的先序,中序,后序遍历以及线索二叉树的遍历 头文件 //*********** ...

  7. 带父节点的平衡二叉树_Python算法系列—深度优先遍历算法【二叉树】

    一.什么是深度优先遍历 深度优先遍历算法是经典的图论算法.从某个节点v出发开始进行搜索.不断搜索直到该节点所有的边都被遍历完,当节点v所有的边都被遍历完以后,深度优先遍历算法则需要回溯到v以前驱节点来 ...

  8. java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

    package com.yc.test; import java.util.ArrayList; import java.util.List; import com.yc.tree.ThreeLink ...

  9. 算法(2)-二叉树的遍历(递归/迭代)python实现

    二叉树的遍历 1.深度优先DFS 1.1 DFS 递归解法 1.1.1先序遍历 1.1.2中序遍历 1.1.3后序遍历 1.2 DFS迭代解法 1.2.1先序遍历 1.2.2中序遍历 1.2.3后序遍 ...

最新文章

  1. hihoCoder-1828 2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II BFS
  2. Swift2.0语言教程之函数的返回值与函数类型
  3. fb驱动安装linux系统,drm 驱动是如何创建 fb device 的
  4. Win10计算机首次使用时间,如何查看Win10开机运行了多长时间
  5. .NET团队送给.NET开发人员的云原生学习资源
  6. 360浏览器查看html文件在哪里,360浏览器8菜单栏怎么弄出来?如何查看网站源代码...
  7. Opencv--resize函数五种插值算法实现
  8. 【bzoj 十连测】[noip2016十连测第三场]Problem C: 序列(静态主席树)
  9. oracle安装后怎么用plsql连接,oracle11g安装和使用PLSQL连接
  10. 【图像评价】基于matlab GUI图像客观评价【含Matlab源码 855期】
  11. 车牌识别算法实现及其代码实现之三:车牌识别
  12. 【Day4.5】走人行天桥去百丽宫海生馆
  13. Adobe reader update 无法将数值disableexceptionchainvaliddation写入键/sofeware...请验证您对该有足够
  14. 论单片机IO引脚驱动能力的提高
  15. 【R语言】沈阳地铁数据处理及站间流量统计——R语言第五次实训
  16. leetcode2248. 多个数组求交集【290场周赛】(java)
  17. IntelliJ IDEA的下载安装与破解
  18. 云计算与大数据——云计算概述
  19. 在JSP中连接数据库及使用
  20. error-2015-9-9

热门文章

  1. Zookeeper基于Java访问-权限
  2. rocketmq-console集群监控平台搭建
  3. 微服务网关Gateway-PrefixPath讲解
  4. spring事务管理-演示事务的环境准备
  5. 使用Github(基本概念实战操作)
  6. SpringMVC+Spring+mybatis
  7. c语言进程调度报告,进程调度(C语言实现).doc
  8. 深入浅出extjs第2版_LINGO实例教程第2版第2期上线
  9. 用oracle怎么测试,oracle – 如何(单位)测试数据密集的PL / SQL应用程序
  10. 200801一阶段1函数封装