1. class Node(object):
  2. """结点"""
  3. def __init__(self, data):
  4. self.data = data
  5. self.lchild = None
  6. self.rchild = None
  7. class BinaryTree(object):
  8. """二叉树"""
  9. def __init__(self, node=None):
  10. self.root = node
  11. def is_empty(self):
  12. """判断是否为空树"""
  13. return self.root is None
  14. def add(self, item):
  15. """在树的最后添加结点"""
  16. # 要添加的结点
  17. node = Node(item)
  18. # 空树
  19. if self.root is None:
  20. self.root = node
  21. return
  22. # 存放结点的队列, 从根结点开始
  23. queue = [self.root]
  24. while queue:
  25. cur_node = queue.pop(0)
  26. # 根结点的左孩子为空, 直接添加
  27. if cur_node.lchild is None:
  28. cur_node.lchild = node
  29. return
  30. # 根结点的左孩子不为空, 添加到结点队列
  31. else:
  32. queue.append(cur_node.lchild)
  33. # 根结点的右孩子为空, 直接添加
  34. if cur_node.rchild is None:
  35. cur_node.rchild = node
  36. return
  37. # 根结点的右孩子不为空, 添加到结点队列
  38. else:
  39. queue.append(cur_node.rchild)
  40. def breadth_travel(self):
  41. """广度优先遍历"""
  42. if self.root is None:
  43. return
  44. # 存放树结点的队列
  45. queue = [self.root]
  46. # 左右孩子均不为空,不进队列, 只弹出结点, 队列为空时结束
  47. while queue:
  48. # 弹出当前结点
  49. cur_node = queue.pop(0)
  50. print(cur_node.data, end=" ")
  51. # 左孩子不为空, 进队列
  52. if cur_node.lchild is not None:
  53. queue.append(cur_node.lchild)
  54. # 右孩子不为空, 进队列
  55. if cur_node.rchild is not None:
  56. queue.append(cur_node.rchild)
  57. def pre_order(self, node):
  58. """前序遍历, 根左右"""
  59. if node is None:
  60. return
  61. print(node.data, end=" ")
  62. self.pre_order(node.lchild)
  63. self.pre_order(node.rchild)
  64. def in_order(self, node):
  65. """中序遍历, 左根右"""
  66. if node is None:
  67. return
  68. self.in_order(node.lchild)
  69. print(node.data, end=" ")
  70. self.in_order(node.rchild)
  71. def post_order(self, node):
  72. """后序遍历, 左右根"""
  73. if node is None:
  74. return
  75. self.post_order(node.lchild)
  76. self.post_order(node.rchild)
  77. print(node.data, end=" ")
  78. if __name__ == '__main__':
  79. tree = BinaryTree()
  80. print(tree.is_empty())
  81. tree.add(0)
  82. tree.add(1)
  83. tree.add(2)
  84. tree.add(3)
  85. tree.add(4)
  86. tree.add(5)
  87. tree.add(6)
  88. tree.add(7)
  89. tree.add(8)
  90. tree.add(9)
  91. tree.breadth_travel() # 0 1 2 3 4 5 6 7 8 9
  92. print()
  93. tree.pre_order(tree.root) # 0 1 3 7 8 4 9 2 5 6
  94. print()
  95. tree.in_order(tree.root) # 7 3 8 1 9 4 0 5 2 6
  96. print()
  97. tree.post_order(tree.root) # 7 8 3 9 4 1 5 6 2 0
  98. print()

python---二叉树广度优先和深度优先遍历的实现的更多相关文章

  1. 【图数据结构的遍历】java实现广度优先和深度优先遍历

    [图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...

  2. c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)

    一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...

  3. python二叉树递归算法之后序遍历,前序遍历,中序遍历

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2016-11-18 08:53:45 # @Author : why_not_try ...

  4. js实现对树深度优先遍历与广度优先遍历

    深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...

  5. C++ 二叉树深度优先遍历和广度优先遍历

    二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...

  6. PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)

    前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...

  7. 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]

    深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 ...

  8. Python算法-二叉树深度优先遍历

    二叉树 组成: 1.根节点  BinaryTree:root 2.每一个节点,都有左子节点和右子节点(可以为空)  TreeNode:value.left.right 二叉树的遍历: 遍历二叉树:深度 ...

  9. 05 (OC) 二叉树 深度优先遍历和广度优先遍历

    总结深度优先与广度优先的区别   1.区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列. 2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入 ...

随机推荐

  1. clang的线程安全分析模块 thread safety analysis

    介绍 Clang的线程安全分析模块是C++语言的一个扩展,能对代码中潜在的竞争条件进行警告.这种分析是完全静态的(即编译时进行),没有运行时的消耗.当前这个功能还在开发中,但它已经具备了足够的成熟度, ...

  2. 面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java程序员,Redi ...

  3. 前面顺序表的补充(复杂度,未实现的算法,空间扩展)(基于c语言)

    0.对于顺序表中的n个元素,如果在下标i的位置之前插入一个元素,则需要将后面n-i个元素向后移动一位:如果是删除下标为i处的元素,则是则需要将后面n-i-1个元素向前移动一位.如果说在i的位置插入和删 ...

  4. Java 程序性能问题

    ● 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步 ...

  5. logging 日志配用

    第一步,创建一个logger: 第二步,创建一个handler,用于写入日志文件: 第三步,再创建一个handler,用于输出到控制台: 第四步,定义handler的输出格式: 第五步,将logger ...

  6. 面向对象编程(C++篇4)——RAII

    目录 1. 概述 2. 详论 2.1. 堆.栈.静态区 2.2. 手动管理资源的弊端 2.3. 间接使用 2.4. 自下而上的抽象 3. 总结 4. 参考 1. 概述 在前面两篇文章<面向对象编 ...

  7. python爬虫 Selenium库学习

    一.自动化测试工具,支持多种浏览器,解决JS渲染问题 二.安装 pip3 install Selenium 三.操作介绍(因为是学习别人的课程为了尊重知识产权,部分代码就不显示了) 1驱动浏览器 br ...

  8. vue Cannot read property ‘tapPromise‘ of undefined

    https://blog.csdn.net/qq379682421/article/details/111574290 https://github.com/SimenB/add-asset-html ...

  9. volatile 能使得一个非原子操作变成原子操作吗?

    一个典型的例子是在类中有一个 long 类型的成员变量.如果你知道该成员变量 会被多个线程访问,如计数器.价格等,你最好是将其设置为 volatile.为什么? 因为 Java 中读取 long 类型 ...

  10. 说出 JDK 1.7 中的三个新特性?

    虽然 JDK 1.7 不像 JDK 5 和 8 一样的大版本,但是,还是有很多新的特性, 如 try-with-resource 语句,这样你在使用流或者资源的时候,就不需要手动关 闭,Java 会自 ...