基于python实现二叉树的遍历
"""
二叉树实践:
用递归构建树的遍历 # 思路分析
-- 1.使用链式存储,一个Node表示一个数的节点
-- 2.节点考虑使用两个属性变量,分别表示左连接右连接 """
# 用列表存储,[d,l,r],其中d表示根节点,l/r左子树和右子树
# bitree.py 二叉树的简单实践 # 自定义异常类
class QueueError(Exception):
pass # 队列-顺序存储代码-入队,出队,判断空满
class SeqQueue:
def __init__(self):
# 创建空列表作为存储空间
self._elems = [] # 入队-加到最后,内存不移动
def enqueue(self,val):
self._elems.append(val) # 出队-头部删除,内存移动
def dequeue(self):
# 空队列,报异常
# if not self._elems: # 如果为空,假假真
if self._elems == []:
raise QueueError("queue is empty")
# 非空队列,pop出第一个元素
return self._elems.pop(0) # 判断空满
def is_empty(self):
return self._elems == [] # 打印队列
def print_queue(self):
# 先判断是否为空
if self._elems == []:
raise QueueError("queue is empty")
else:
for item in self._elems:
print(item,end= " ")
print() # 反转队列 或者用顺序栈的进出栈(出队入栈,出栈入队)方法
def reverse_queue(self):
"""
算法:1.设置中间列表,遍历n-1次从队列出列,值存入中间列表
2.遍历n-1次,从中间列表倒着入列
:return: 反转后的队列
"""
if self.is_empty():
raise QueueError("queue is empty")
middle_list = []
len_iterator = len(self._elems)-1
for i in range(len_iterator):
middle_list.append(self.dequeue())
for i in range(len_iterator):
self.enqueue(middle_list.pop()) # 二叉树节点
class Node:
def __init__(self,val,left=None,right=None):
self.val = val
self.left = left
self.right = right # 二叉树的操作,遍历类
class BiTree:
def __init__(self,root = None):
self.root = root # 先序遍历
def preorder(self,node):
if node is None: # 终止条件
return
print(node.val,end= " ")
self.preorder(node.left)
self.preorder(node.right) # 中序遍历
def inorder(self,node):
if node is None: # 终止条件
return
self.inorder(node.left)
print(node.val,end= " ")
self.inorder(node.right) # 后序遍历
def postorder(self,node):
if node is None: # 终止条件
return
self.postorder(node.left)
self.postorder(node.right)
print(node.val,end= " ") # 层次遍历-基于顺序队列实现
def levelorder(self,node):
"""
让初始节点入队,谁出队遍历谁,
并且其左右子节点直到队列为空
:param node:
:return:
"""
sq = SeqQueue()
sq.enqueue(node)
while not sq.is_empty():
node = sq.dequeue()
# 打印出队元素
print(node.val,end=" ")
if node.left:
sq.enqueue(node.left)
if node.right:
sq.enqueue(node.right) if __name__ == "__main__":
# 后序 B F G D I H E C A
b = Node("B")
f = Node("F")
g = Node("G")
d = Node("D",f,g)
i = Node("I")
h = Node("H")
e = Node("E",i,h)
c = Node("C",d,e)
a = Node("A",b,c) # 树根
# 将a作为遍历的起始位置
bt = BiTree(a)
bt.preorder(a)
print()
bt.inorder(a)
print()
bt.postorder(a)
print()
bt.levelorder(a)
基于python实现二叉树的遍历的更多相关文章
- Python算法-二叉树深度优先遍历
二叉树 组成: 1.根节点 BinaryTree:root 2.每一个节点,都有左子节点和右子节点(可以为空) TreeNode:value.left.right 二叉树的遍历: 遍历二叉树:深度 ...
- python实现二叉树的遍历以及基本操作
主要内容: 二叉树遍历(先序.中序.后序.宽度优先遍历)的迭代实现和递归实现: 二叉树的深度,二叉树到叶子节点的所有路径: 首先,先定义二叉树类(python3),代码如下: class TreeNo ...
- Python实现二叉树的遍历
二叉树是有限个元素的集合,该集合或者为空.或者有一个称为根节点(root)的元素及两个互不相交的.分别被称为左子树和右子树的二叉树组成. 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉 ...
- python算法-二叉树广度优先遍历
广度优先遍历:优先遍历兄弟节点,再遍历子节点 算法:通过队列实现-->先进先出 广度优先遍历的结果: 50,20,60,15,30,70,12 程序遍历这个二叉树: # encoding=utf ...
- python实现二叉树递归遍历与非递归遍历
一.中序遍历 前中后序三种遍历方法对于左右结点的遍历顺序都是一样的(先左后右),唯一不同的就是根节点的出现位置.对于中序遍历来说,根结点的遍历位置在中间. 所以中序遍历的顺序:左中右 1.1 递归实现 ...
- 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现
文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ...
- Python实现二叉树的前序、中序、后序、层次遍历
有关树的理论部分描述:<数据结构与算法>-4-树与二叉树: 下面代码均基于python实现,包含: 二叉树的前序.中序.后序遍历的递归算法和非递归算法: 层次遍历: 由前序序列.中 ...
- Python实现二叉树的四种遍历
对于一个没学过数据结构这门课程的编程菜鸟来说,自己能理解数据结构中的相关概念,但是自己动手通过Python,C++来实现它们却总感觉有些吃力.递归,指针,类这些知识点感觉自己应用的不够灵活,这是自己以 ...
- Python实现二叉树的左中右序遍历
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/3/18 12:31 # @Author : baoshan # @Site ...
随机推荐
- 【盗墓笔记】图解使用fat-aar方式在AndroidStudio中打包嵌套第三方aar的aar
将一些项目中的一些独立功能打包成aar,不仅能于项目解耦,还能够提供给其它项目使用相同的功能,可谓是为项目开发带来了很大的便利.最近第一次做sdk,碰到一些问题,花了不少时间才解决,所以这里做一下简单 ...
- Python实现加密的ZIP文件解压(密码已知)
博主在上篇博文介绍了<Python实现加密的RAR文件解压(密码已知)>后,又尝试了ZIP文件的解压方法,下面开始分享. 当ZIP文件的压缩密码已知时,可以通过调用zipfile库进行解压 ...
- oracle之二数据字典表和动态性能视图
数据字典表和动态性能视图 Oracle提供了大量的内部表,它们记录了数据库对象的更改和修正.可以将这些内部表划分为两种主要类型:静态的数据字典表和动态的性能表.这些内部表是由oracle维护的,可以说 ...
- 抓包工具Burp Suite安装步骤(待补充)
Burp Suite V2.1(破解版)安装步骤:(可以自行下载破解版或汉化版) 百度网盘下载地址: 链接:https://pan.baidu.com/s/1bU5JME3OsEsXrSirTdesR ...
- Java 合并、拆分PPT幻灯片
序 在日常使用PPT时,为了便于操作和管理文档,时常会遇到需要将PPT幻灯片进行合并或拆分的情况.本文将通过Java程序来演示如何进行上述操作. 示例要点: 1. 合并PPT幻灯片 1.1 将第一个P ...
- RabbitMQ消息积压的几种解决思路
在日常工作中使用RabbitMQ偶尔会遇不可预料的情况导致的消息积压,一般出现消息积压基本上分为几种情况: 消费者消费消息的速度赶不上生产速度,这总问题主要是业务逻辑没设计好消费者和生产者之间的平衡, ...
- Mybatis 注解形式
1.查询 // 查询 @Select("select id, name, type, numbers, cancelled, completed, percentage from c ...
- python-文本操作和二进制储存
0x01 open方法 r read w write a append b byte test.txt内容为 yicunyiye wutang 读取test.txt f = open('test.tx ...
- php第三天-数组的定义,数组的遍历,常规数组的操作
0x01 数组分类 在php中有两种数组:索引数组和关联数组 索引数组的索引值是整数,以0开始.当通过位置来标识东西时用索引数组. 关联数组是以字符串作为索引值,关联数组更像操作表.索引值为列名,用于 ...
- IOT(esp8266)
今日工具: 硬件: esp8266 DHT11温湿度传感器 软件: Arduino ESP8266 是一款由乐鑫 Espressif 公司制作的低成本的 Wi-Fi 芯片,具有完整的 TCP / IP ...