"""
二叉树实践:
用递归构建树的遍历 # 思路分析
-- 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实现二叉树的遍历的更多相关文章

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

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

  2. python实现二叉树的遍历以及基本操作

    主要内容: 二叉树遍历(先序.中序.后序.宽度优先遍历)的迭代实现和递归实现: 二叉树的深度,二叉树到叶子节点的所有路径: 首先,先定义二叉树类(python3),代码如下: class TreeNo ...

  3. Python实现二叉树的遍历

    二叉树是有限个元素的集合,该集合或者为空.或者有一个称为根节点(root)的元素及两个互不相交的.分别被称为左子树和右子树的二叉树组成. 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉 ...

  4. python算法-二叉树广度优先遍历

    广度优先遍历:优先遍历兄弟节点,再遍历子节点 算法:通过队列实现-->先进先出 广度优先遍历的结果: 50,20,60,15,30,70,12 程序遍历这个二叉树: # encoding=utf ...

  5. python实现二叉树递归遍历与非递归遍历

    一.中序遍历 前中后序三种遍历方法对于左右结点的遍历顺序都是一样的(先左后右),唯一不同的就是根节点的出现位置.对于中序遍历来说,根结点的遍历位置在中间. 所以中序遍历的顺序:左中右 1.1 递归实现 ...

  6. 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现

    文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ...

  7. Python实现二叉树的前序、中序、后序、层次遍历

      有关树的理论部分描述:<数据结构与算法>-4-树与二叉树:   下面代码均基于python实现,包含: 二叉树的前序.中序.后序遍历的递归算法和非递归算法: 层次遍历: 由前序序列.中 ...

  8. Python实现二叉树的四种遍历

    对于一个没学过数据结构这门课程的编程菜鸟来说,自己能理解数据结构中的相关概念,但是自己动手通过Python,C++来实现它们却总感觉有些吃力.递归,指针,类这些知识点感觉自己应用的不够灵活,这是自己以 ...

  9. Python实现二叉树的左中右序遍历

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/3/18 12:31 # @Author : baoshan # @Site ...

随机推荐

  1. Python实现加密的RAR文件解压(密码已知)

    博主之前在网上找了很多资料,发现rarfile库不能直接调用,需要安装unrar模块,下面将详细介绍整个实现流程. 第一步:安装unrar模块,直接pip install unrar可能会找不到库,需 ...

  2. touchstart 事件与 click 事件的冲突

    const clickEvent = (function() {   if ('ontouchstart' in document.documentElement === true)     retu ...

  3. Linux下 ls 命令的高级用法8例

    Linux下 ls 命令的高级用法8例 在Linux下,ls这个命令大家肯定太熟悉了,良许相信只要是Linux工程师,每天都会离不开这个命令,而且一天会使用个几百次.但是,除了 ls -l 以外,你还 ...

  4. jmeter(一)

    一.首先是下载:下载地址为:http://jmeter.apache.org/download_jmeter.cgi选择Binaries下的相应压缩包.ps:jmeter是开源项目,一般这种开源项目B ...

  5. JS 浏览器BOM

    BOM:Browser Object Model 浏览器对象模型 2.组成: window :窗口对象 1.创建: 2.方法: *与弹出框有关 1.alert(); 弹出警告框 2.confirm() ...

  6. C语言汇总2

    (10-15) 注释:1.单行注释可以嵌套单行注释 eg .//lalalal//lalalal(/后面都是注释完的) 2.多行注释可以嵌套单行注释 (两个**之间的都是注释的) 3.单行注释可以嵌套 ...

  7. Orchard Core创建CMS/Blog站点

    安装.NET Core SDK 下载并安装当前最新版本.NET Core SDK 3.1: https://dotnet.microsoft.com/download 安装visual studio ...

  8. 转载:关于Python3中venv虚拟环境

    https://www.cnblogs.com/zhaof/p/7299025.html

  9. 总结一下,selenium 自动化流程如下

    自动化程序调用Selenium 客户端库函数(比如点击按钮元素) 客户端库会发送Selenium 命令 给浏览器的驱动程序 浏览器驱动程序接收到命令后 ,驱动浏览器去执行命令 浏览器执行命令 浏览器驱 ...

  10. hadoop分布式格式化时出现异常java.net.unknownhostexception

    当搭建好分布式集群后,准备使用命令格式化时 hdfs namenode format 在日志的最后一行出现 java.net.unknownhostexception的异常,通常是你的主机名没有配置好 ...