python实现二叉树的遍历
作者:xiao2macf 时间:2023-06-29 17:45:42
本文实例为大家分享了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
标签:python,二叉树,遍历
0
投稿
猜你喜欢
《JavaScript语言精粹》译者序及样章试读
2009-04-03 11:38:00
几个简单的基本的sql语句
2024-01-20 18:55:58
php结合js实现点击超链接执行删除确认操作
2023-11-15 03:30:51
Python split() 函数拆分字符串将字符串转化为列的方法
2022-02-12 00:14:19
Mysql中日期和时间函数介绍
2008-05-24 08:16:00
python opencv调用笔记本摄像头
2022-07-19 14:03:34
ChatGPT与Remix Api服务在浏览器url地址中对话详解
2023-06-23 12:35:50
区别Javascript中的Null与Undefined
2007-12-13 20:24:00
MYSQL中 char 和 varchar的区别
2024-01-25 22:22:52
CSS.JS文件发布机制的思考
2009-08-04 13:07:00
Echarts如何自定义label标签的样式(formatter,rich,添加图标等操作)
2024-04-28 09:34:04
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2023-09-11 00:33:45
Oracle使用PL/SQL操作COM对象
2010-07-21 12:56:00
uniapp封装小程序雷达图组件的完整代码
2024-04-17 09:55:26
Python复制Word内容并使用格式设字体与大小实例代码
2023-01-10 05:48:20
SQL Server管理 这些你懂吗?
2011-07-01 13:40:23
如何利用python进行时间序列分析
2022-01-21 13:56:38
Django模板过滤器和继承示例详解
2023-10-25 16:52:56
在go中使用omitempty的代码实例
2024-04-25 15:12:47
Bootstrap select多选下拉框实现代码
2023-09-15 12:44:55