python---二叉树广度优先和深度优先遍历的实现
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---二叉树广度优先和深度优先遍历的实现的更多相关文章
- 【图数据结构的遍历】java实现广度优先和深度优先遍历
[图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...
- c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)
一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...
- python二叉树递归算法之后序遍历,前序遍历,中序遍历
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2016-11-18 08:53:45 # @Author : why_not_try ...
- js实现对树深度优先遍历与广度优先遍历
深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...
- C++ 二叉树深度优先遍历和广度优先遍历
二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree r ...
- PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)
前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 ...
- Python算法-二叉树深度优先遍历
二叉树 组成: 1.根节点 BinaryTree:root 2.每一个节点,都有左子节点和右子节点(可以为空) TreeNode:value.left.right 二叉树的遍历: 遍历二叉树:深度 ...
- 05 (OC) 二叉树 深度优先遍历和广度优先遍历
总结深度优先与广度优先的区别 1.区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列. 2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入 ...
随机推荐
- AE初步
AE开发就是我们常说的ArcEngine二次开发. 1.配置环境 目前来讲,稳定的版本配置,一般配置为VS2012+ArcEngine10.2. 安装ArcEngine时,安装图中三项即可,顺序为Ar ...
- Python 实现 JWT 生成
Python 实现 JWT 生成 JWT 简介:https://www.jianshu.com/p/576dbf44b2ae Json web token (JWT), 是为了在网络应用环境间传递声明 ...
- [JS基础] 带你深入了解JS原型
简介 下面这张图大家应该很很熟悉了,各位大佬讲原型及原型链的时候是大部分都会用到下面这张图片的 我想以自己的方式来讲述一遍,一是帮助我自己更好的复习,二是希望能够帮助到想要复习或者学习原型的同学 在讲 ...
- KVM 虚拟化基本知识,virtio工作原理
KVM虚拟化的基本知识,virtio的工作流程及原理,virtio-vhost, virtio-vhost-user pci 配置空间,是谁在kick 写pci配置空间的?又是通过什么机制通知给qem ...
- bat加mimikatz一键获取密码
1 @echo off 2 >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\sys ...
- webdriver原理及操作
webdriver原理: 1. WebDriver 启动目标浏览器,并绑定到指定端口.该启动的浏览器实例,做为 webdriver 的 remote server. 2. Client 端通过 Com ...
- js学习笔记-Java script正则表达式
创建正则表达式 js中的正则包含在两个斜杠之间:/abc+v/ 正则中的特殊字符 \: 1.当后面不是特殊字符时表示字符边界 2.当后面是特殊字符时表示转义 ^: 1.匹配首位,例如,/^A/ 并不会 ...
- JDBC如何解决乱码
只要在连接URL字符里添加参数 ?useUnicode=true&characterEncoding=utf-8 完整的URL字符串如下: 1 String url = "jdbc: ...
- 在Java中,如何跳出当前的多重嵌套循环?
答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环.(Java中支持带标签的break和continue语句,作用有点类似于C和C++中的goto语句,但是就像要避免使用goto ...
- MariaDB数据库设置用户密码
SET PASSWORD [FOR user] = { PASSWORD('some password') | OLD_PASSWORD('some password') | 'encrypted p ...