python实现二叉树的遍历
作者:xiao2macf 发布时间:2023-06-29 17:45:42
标签:python,二叉树,遍历
本文实例为大家分享了python实现二叉树的遍历具体代码,供大家参考,具体内容如下
代码:
# -*- coding: gb2312 -*-
class Queue(object):
def __init__(self):
self.q = []
def enqueue(self, item):
self.q.append(item)
def dequeue(self):
# if self.q != []:
if len(self.q)>0:
return self.q.pop(0)
else:
return None
def length(self):
return len(self.q)
def isempty(self):
return len(self.q)==0
class Stack(object):
def __init__(self):
self.s = []
def push(self, item):
self.s.append(item)
def pop(self):
if self.s !=[]:
item = self.s.pop(-1)
else:
item = None
return item
def length(self):
return len(self.s)
def isempty(self):
return self.s == []
def top(self):
return self.s[-1]
class TreeNode(object):
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
self.visited = False
def setData(self, data):
self.data = data
def setLeft(self, left):
self.left = left
def setRight(self, right):
self.right = right
def visit(self):
print self.data,
self.visited = True
def deVisit(self):
self.visited = False
class BinaryTree(object):
def __init__(self, root):
self.root = root
# 前序遍历(递归)
def freshVisit(self, node):
if node is not None:
node.deVisit()
if node.left:
self.freshVisit(node.left)
if node.right:
self.freshVisit(node.right)
# 前序遍历(递归)
def preOrder(self, node):
if node is not None:
node.visit()
if node.left:
self.preOrder(node.left)
if node.right:
self.preOrder(node.right)
# 中序遍历(递归)
def inOrder(self, node):
if node.left:
self.inOrder(node.left)
if node is not None:
node.visit()
if node.right:
self.inOrder(node.right)
# 后序遍历(递归)
def postOrder(self, node):
if node.left:
self.postOrder(node.left)
if node.right:
self.postOrder(node.right)
if node is not None:
node.visit()
# 递归遍历
def orderTraveral(self, type):
if type == 0:
self.preOrder(self.root)
elif type == 1:
self.inOrder(self.root)
elif type == 2:
self.postOrder(self.root)
# 前序遍历(非递归)
# 用到一个栈和一个队列
# 首先是根节点入栈,再循环出栈
# 出栈元素不为空,则访问
# 出栈元素有左孩子节点则入栈,如果有右孩子节点则入队列
# 出栈元素为空,则访问队列
# 队列也为空则结束循环,否则队列元素出队
# 访问出队元素,出队元素有左孩子节点则入栈,出队元素有右孩子节点则入队列
# 循环直到最后退出
def preOrderByNotRecursion(self):
s = Stack()
q = Queue()
q.enqueue(self.root)
while not s.isempty() or not q.isempty():
if not q.isempty():
item = q.dequeue()
item.visit()
if item.left:
q.enqueue(item.left)
if item.right:
s.push(item.right)
elif not s.isempty():
item = s.pop()
item.visit()
if item.left:
q.enqueue(item.left)
if item.right:
s.push(item.right)
# 前序遍历(非递归)
# 用到一个栈
# 首先是根节点入栈,再循环出栈
# 栈顶元素不为空,则访问, 并置已访问标志
# 如栈顶元素有左孩子节点则入栈
# 若栈顶元素已访问,则出栈
# 出栈元素若有右孩子节点则入栈
# 循环直到栈无元素退出
def preOrderByNotRecursion2(self):
s = Stack()
s.push(self.root)
while not s.isempty():
item = s.top()
if item.visited:
s.pop()
if item.right:
s.push(item.right)
else:
item.visit()
if item.left:
s.push(item.left)
# 中序遍历(非递归)
# 用到一个栈
# 先将根节点入栈,循环出栈
# 如果出栈元素有左孩子节点并且左孩子节点没有访问过则入栈
# 反之,则出栈并且访问;如果出栈元素有右孩子节点则入栈
# 重复以上循环直到栈为空
def inOrderByNotRecursion(self):
s = Stack()
s.push(self.root)
while not s.isempty():
item = s.top()
while(item.left and not item.left.visited):
s.push(item.left)
item = item.left
else:
item = s.pop()
item.visit()
if item.right:
s.push(item.right)
# 后序遍历(非递归)
# 用到一个栈
# 先将根节点入栈,循环出栈
# 如果出栈元素有左孩子节点并且左孩子节点没有访问过则入栈
# 反之,如果栈顶元素如果有右孩子节点并且右孩子节点没有访问过,则入栈
# 否则,出栈并访问
# 重复以上循环直到栈为空
def postOrderByNotRecursion(self):
s = Stack()
s.push(self.root)
while not s.isempty():
item = s.top()
while(item.left and not item.left.visited):
s.push(item.left)
item = item.left
else:
if item.right and not item.right.visited:
s.push(item.right)
else:
item = s.pop()
item.visit()
# 层次遍历(非递归)
# 用到一个队列
# 先将根节点入队列
# 从队列取出一个元素,访问
# 如有左孩子节点则入队,如有右孩子节点则入队
# 重复以上操作直到队列入空
def layerOrder(self):
q = Queue()
q.enqueue(self.root)
while not q.isempty():
item = q.dequeue()
item.visit()
if item.left:
q.enqueue(item.left)
if item.right:
q.enqueue(item.right)
# A
# B C
# D E F G
#H
if __name__ == '__main__':
nE = TreeNode('E');
nF = TreeNode('F');
nG = TreeNode('G');
nH = TreeNode('H');
nD = TreeNode('D', nH);
nB = TreeNode('B', nD, nE);
nC = TreeNode('C', nF, nG);
nA = TreeNode('A', nB, nC);
bTree = BinaryTree(nA);
# 前序递归遍历
print '----------前序遍历(递归)-----------'
bTree.orderTraveral(0)
print '\n----------中序遍历(递归)-----------'
bTree.orderTraveral(1)
print '\n----------后序遍历(递归)-----------'
bTree.orderTraveral(2)
print '\n\n----------前序遍历(非递归)-----------'
print '----------方法一-----------'
bTree.freshVisit(bTree.root)
bTree.preOrderByNotRecursion()
print '\n----------方法二-----------'
bTree.freshVisit(bTree.root)
bTree.preOrderByNotRecursion2()
print '\n\n----------中序遍历(非递归)-----------'
bTree.freshVisit(bTree.root)
bTree.inOrderByNotRecursion()
print '\n\n----------后序遍历(非递归)-----------'
bTree.freshVisit(bTree.root)
bTree.postOrderByNotRecursion()
print '\n\n----------层次遍历(非递归)-----------'
bTree.freshVisit(bTree.root)
bTree.layerOrder()
结果:
来源:http://blog.csdn.net/xxm524/article/details/50768610


猜你喜欢
- 为了实现Nao机器人与电脑端的TCP通信,于是研究了一下Python实现TCP通信,在网上也看到了很多例子,但大多都是在一台机器上验证。在两
- 我的数据库和报表服务的版本如下:数据库:SQL Server 2008 R2报表服务:SQL Server 2008 R2 Reportin
- 前言项目中会有点到直线距离计算、两条直线交点坐标计算、两条直线夹角计算的需求。一、点到直线距离计算由于项目中得到点的坐标最容易,因此采用向量
- uniapp页面跳转的几种方式一、uni.navigateTo定义:保留当前页面,跳转到应用内的某个页面,使用uni.navigateBac
- 先看一个需求from collections import defaultdict"""需求: 统计user_
- <%'使用说明'Dim a'Set a=new CreateExce
- 实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性。实例1:class
- 对于个人站长来说,如何能使自己的网站与众不同、充满个性,一直是不懈努力的目标。除了尽量提高页面的视觉效
- 全选、全不选、反选这几个功能我们经常会用到,如我们可以用在文章列表管理页面,也可以用在音乐播放页面,使用全选我们可以很方便的进行批量操作,如
- 在VirtualBox中使用Ubuntu虚拟机中,会出现虚拟硬盘不够用的情况:查了一下磁盘空间,如下所示:df -H启动CMD命令行,进入V
- 由于服务器无法上网,不得不采用离线方式安装。IDE=pycharm-community-2019.2.3,python=3.5.4。1 安装
- 当你使用UPDATE, INSERT, DELETE语句更新数据的时候,你就改变了两个地方的数据:log buffer和data buffe
- 先给大家介绍下python制作定时发送信息脚本,内容如下所示:文章中提到的菜单是右下角这个需求我们需要做到打开微信获取输入框焦点及输入思路1
- 在win10环境下搭建python3.5.2和tensorflow平台,供大家参考,具体内容如下操作步骤如下:1、官网(https://ww
- 提示框提示框的基本使用方式为:<span data-toggle="tooltip" data-original-
- 一、HTTP协议的网络服务HTTP协议是基于TCP/IP协议栈的,并且它也是一个面向普通文本的协议。只要搞清楚了HTTP请求的报文(报文的头
- 1. 图信号处理知识图卷积神经网络涉及到图信号处理的相关知识,也是由图信号处理领域的知识推导发展而来,了解图信号处理的知识是理解图卷积神经网
- 如下所示:<div id="app"> <h1>我是直接写在构造器里的模板1</h1&g
- osql简单用法:用来将本地脚本执行,适合sql脚本比较大点的情况,执行起来比较方便osql -S serverIP -U sa -P 12
- 前言本文主要给大家介绍了关于golang解析网页利器goquery使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介