class Node(object):
"""结点""" def __init__(self, data):
self.data = data
self.lchild = None
self.rchild = None class BinaryTree(object):
"""二叉树""" def __init__(self, node=None):
self.root = node def is_empty(self):
"""判断是否为空树""" return self.root is None def add(self, item):
"""在树的最后添加结点""" # 要添加的结点
node = Node(item) # 空树
if self.root is None:
self.root = node
return # 存放结点的队列, 从根结点开始
queue = [self.root] while queue: cur_node = queue.pop(0) # 根结点的左孩子为空, 直接添加
if cur_node.lchild is None:
cur_node.lchild = node
return # 根结点的左孩子不为空, 添加到结点队列
else:
queue.append(cur_node.lchild) # 根结点的右孩子为空, 直接添加
if cur_node.rchild is None:
cur_node.rchild = node
return # 根结点的右孩子不为空, 添加到结点队列
else:
queue.append(cur_node.rchild) def breadth_travel(self):
"""广度优先遍历""" if self.root is None:
return # 存放树结点的队列
queue = [self.root] # 左右孩子均不为空,不进队列, 只弹出结点, 队列为空时结束
while queue: # 弹出当前结点
cur_node = queue.pop(0)
print(cur_node.data, end=" ") # 左孩子不为空, 进队列
if cur_node.lchild is not None:
queue.append(cur_node.lchild) # 右孩子不为空, 进队列
if cur_node.rchild is not None:
queue.append(cur_node.rchild) def pre_order(self, node):
"""前序遍历, 根左右""" if node is None:
return print(node.data, end=" ")
self.pre_order(node.lchild)
self.pre_order(node.rchild) def in_order(self, node):
"""中序遍历, 左根右""" if node is None:
return self.in_order(node.lchild)
print(node.data, end=" ")
self.in_order(node.rchild) def post_order(self, node):
"""后序遍历, 左右根""" if node is None:
return self.post_order(node.lchild)
self.post_order(node.rchild)
print(node.data, end=" ") if __name__ == '__main__':
tree = BinaryTree()
print(tree.is_empty())
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
tree.breadth_travel() # 0 1 2 3 4 5 6 7 8 9
print()
tree.pre_order(tree.root) # 0 1 3 7 8 4 9 2 5 6
print()
tree.in_order(tree.root) # 7 3 8 1 9 4 0 5 2 6
print()
tree.post_order(tree.root) # 7 8 3 9 4 1 5 6 2 0
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. 分布式 PostgreSQL 集群(Citus)官方示例 - 多租户应用程序实战

    如果您正在构建软件即服务 (SaaS) 应用程序,您可能已经在数据模型中内置了租赁的概念. 通常,大多数信息与租户/客户/帐户相关,并且数据库表捕获这种自然关系. 对于 SaaS 应用程序,每个租户的 ...

  2. Dapr云原生应用开发系列7:工作流集成

    题记:这篇介绍一个很有意思的东西,Dapr和Logic Apps这样的工作流引擎集成. Dapr工作流 在1年多前,Dapr的孵化团队搞了一个很有意思的东西:把Dapr和Logic Apps集成起来, ...

  3. 17 数组 Arrays类

    Arrays类 概念 数组的工具类java.util.Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作 ...

  4. ArcMap操作随记(8)

    1.构建两点之间连线 [构造视线] 2.编辑相邻多边形(边界等) [拓扑]工具条→[共享要素] 3.点要素空间分配 [创建泰森多边形]→[裁剪] 4.面要素空间分配 [要素转折点]→[创建泰森多边形] ...

  5. [JS基础] 带你深入了解JS原型

    简介 下面这张图大家应该很很熟悉了,各位大佬讲原型及原型链的时候是大部分都会用到下面这张图片的 我想以自己的方式来讲述一遍,一是帮助我自己更好的复习,二是希望能够帮助到想要复习或者学习原型的同学 在讲 ...

  6. Flash XSS

    示例: 创建一个测试flash,代码如下,导出swf文件 //取m参数 var m=_root.m; //取showInfo参数 var showInfo=_root.showInfo; //调用ht ...

  7. dev编译器兼容设置及字符串的识别问题

    #include<bits/stdc++.h> using namespace std; bool cmp(char a,char b) { return a>b; } //int ...

  8. 解释WEB 模块?

    Spring的WEB模块是构建在application context 模块基础之上,提供一个适合web应用的上下文.这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参 ...

  9. SpringBoot项目意外出现 循环依赖和注入的对象意外是Null的问题 Requested bean is currently in creation: Is there an unresolvable circular reference? 或 nested exception is java.lang.NullPointerException

    1.Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ...

  10. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?

    Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ...