python---二叉树遍历
重学。
# coding = utf-8
# 二叉树遍历
class Node:
"""节点类"""
def __init__(self, element=None, left_child=None, right_child=None):
self.element = element
self.left_child = left_child
self.right_child = right_child
class Tree:
"""树类"""
def __init__(self):
self.root = Node()
self.tree_queue = []
def add(self, element):
"""为树添加节点"""
node = Node(element)
if self.root.element is None:
self.root = node
self.tree_queue.append(self.root)
else:
tree_node = self.tree_queue[0]
if tree_node.left_child is None:
tree_node.left_child = node
self.tree_queue.append(tree_node.left_child)
else:
tree_node.right_child = node
self.tree_queue.append(tree_node.right_child)
self.tree_queue.pop(0)
def front_recursion(self, root):
"""利用递归实现树的先序遍历"""
if root is None:
return
print(root.element, end=' ')
self.front_recursion(root.left_child)
self.front_recursion(root.right_child)
def middle_recursion(self, root):
"""利用递归实现树的中序遍历"""
if root is None:
return
self.middle_recursion(root.left_child)
print(root.element, end=' ')
self.middle_recursion(root.right_child)
def later_recursion(self, root):
"""利用递归实现树的后序遍历"""
if root is None:
return
self.later_recursion(root.left_child)
self.later_recursion(root.right_child)
print(root.element, end=' ')
def front_stack(self, root):
"""利用堆栈实现树的先序遍历"""
if root is None:
return
tree_stack = []
node = root
while node or tree_stack:
while node:
print(node.element, end=' ')
tree_stack.append(node)
node = node.left_child
node = tree_stack.pop()
node = node.right_child
def middle_stack(self, root):
"""利用堆栈实现树的中序遍历"""
if root is None:
return
tree_stack = []
node = root
while node or tree_stack:
while node:
tree_stack.append(node)
node = node.left_child
node = tree_stack.pop()
print(node.element, end=' ')
node = node.right_child
def later_stack(self, root):
"""利用堆栈实现树的后序遍历"""
if root is None:
return
tree_stack_a = []
tree_stack_b = []
node = root
tree_stack_a.append(node)
while tree_stack_a:
node = tree_stack_a.pop()
if node.left_child:
tree_stack_a.append(node.left_child)
if node.right_child:
tree_stack_a.append(node.right_child)
tree_stack_b.append(node)
while tree_stack_b:
print(tree_stack_b.pop().element, end=' ')
def level_queue(self, root):
"""利用队列实现树的层次遍历"""
if root is None:
return
tree_queue = []
node = root
tree_queue.append(node)
while tree_queue:
node = tree_queue.pop(0)
print(node.element, end=' ')
if node.left_child is not None:
tree_queue.append(node.left_child)
if node.right_child is not None:
tree_queue.append(node.right_child)
if __name__ == '__main__':
elem_s = range(10)
# 新建一个二叉树对象
tree = Tree()
for elem in elem_s:
tree.add(elem)
print('广度优先遍历---队列实现层次遍历:')
tree.level_queue(tree.root)
print('\n深度优先遍历---递归实现先序遍历:')
tree.front_recursion(tree.root)
print('\n深度优先遍历---递归实现中序遍历:')
tree.middle_recursion(tree.root)
print('\n深度优先遍历---递归实现后序遍历:')
tree.later_recursion(tree.root)
print('\n深度优先遍历---堆栈实现先序遍历:')
tree.front_stack(tree.root)
print('\n深度优先遍历---堆栈实现中序遍历:')
tree.middle_stack(tree.root)
print('\n深度优先遍历---堆栈实现后序遍历:')
tree.later_stack(tree.root)
C:\Users\Sahara\.virtualenvs\test\Scripts\python.exe C:/Users/Sahara/PycharmProjects/test/python_search.py 广度优先遍历---队列实现层次遍历: 深度优先遍历---递归实现先序遍历: 深度优先遍历---递归实现中序遍历: 深度优先遍历---递归实现后序遍历: 深度优先遍历---堆栈实现先序遍历: 深度优先遍历---堆栈实现中序遍历: 深度优先遍历---堆栈实现后序遍历: Process finished with exit code
python---二叉树遍历的更多相关文章
- Python --- 二叉树的层序建立与三种遍历
二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有....(此处省略好多字)....等的优良特点. 之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结 ...
- python实现二叉树遍历算法
说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...
- Python -二叉树 创建与遍历算法(很详细)
树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...
- 二叉树遍历(非递归版)——python
二叉树的遍历分为广度优先遍历和深度优先遍历 广度优先遍历(breadth first traversal):又称层次遍历,从树的根节点(root)开始,从上到下从从左到右遍历整个树的节点. 深度优先遍 ...
- 算法随笔-二叉树遍历的N种姿势
最近在练习用Python刷算法,leetcode上刷了快300题.一开始怀疑自己根本不会写代码,现在觉得会写一点点了,痛苦又充实的刷题历程.对我这种半路出家的人而言,收获真的很大. 今天就从二叉树遍历 ...
- Python - 二叉树, 堆, headq 模块
二叉树 概念 二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树), 或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树组成. 特点 每个结点最多有两颗子树,所 ...
- python 实时遍历日志文件
首先尝试使用 python open 遍历一个大日志文件, 使用 readlines() 还是 readline() ? 总体上 readlines() 不慢于python 一次次调用 readlin ...
- C++ 二叉树遍历实现
原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...
- 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历
[二叉树遍历模版]前序遍历 1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...
- hdu 4605 线段树与二叉树遍历
思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...
随机推荐
- Tampermonkey-让百度云下载飞起来
1. 简介Tampermonkey是一款免费的浏览器扩展程序. 我们这里用于谷歌浏览器,目的是为了让百度云里面的文件以满速下载,节约金钱. 2. 安装安装Lantern蓝灯或者其他的FQ工具. 打开F ...
- Python——Flask框架
Flask框架相关知识构架 程序的基本结构 模板 Web表单 数据库 电子邮件 程序的结构 用户认证
- Linux 学习 (十) 网络配置
Linux网络管理 学习笔记 配置 IP 地址 ifconfig 命令临时配置 IP 地址 ifconfig eth0 192.168.0.200 netmask 255.255.255.0 #临时设 ...
- rest framework 解析器,渲染器
解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 请求体相关字段: Accept:指定了接收的数据类型 Conte ...
- Centos7 systemctl服务脚本
systemd.service 参考文档 RHEL6和之前的版本使用的初始进程是init,init是一个线性的启动过程,一个接一个的启动,比较慢:systemd则可以多进程启动,速度提高很多. sev ...
- 自定义一个IOC框架
要实现的功能: 将对象的实例化交给自定的ioc容器. 通过注解的方式对接口进行依赖注入 通过getBean("userName")方法那到对象,使用对象的方法 首先,创建一个对象, ...
- Yii2的Gridview应用技巧补充
Yii2框架下的Gridview通常用来展示一张DB表中的数据,十分方便.这里只说一下经常要用到的一些小技巧,其实大多数官方文档都是有的,只是有可能需要在多个文档里. 自动创建的gridview示例. ...
- 用beam实现连接kafka和elasticSearch示例 在flink平台运行
示例实现beam用java编程,监听kafka的testmsg主题,然后将收取到的单词,按5秒做一次统计.结果输出到outputmessage 的kafka主题,同时同步到elasticSearch. ...
- Cucumber常用关键字
常用关键字(中英文对应) 对应的测试用例 Feature(功能) test suite (测试用例集) background(背景) Scenario(场景) test case(测试用例) Sc ...
- wiki中文语料的word2vec模型构建
一.利用wiki中文语料进行word2vec模型构建 1)数据获取 到wiki官网下载中文语料,下载完成后会得到命名为zhwiki-latest-pages-articles.xml.bz2的文件,里 ...