python实现二叉树的遍历
时间:2019-04-11
本文章向大家介绍python实现二叉树的遍历,主要包括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()
结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 【面试虐菜】—— JAVA面试题(1)
- JAVA增删改查XML文件
- javascript去掉字符串前后空格
- 构建通用的 React 和 Node 应用
- 有趣的 CSS 像素艺术
- 【插件开发】—— 11 窃听风云(Java事件监听原理-GEF实例讲解)
- 【面试虐菜】—— JAVA面试题(2)
- JavaMelody监控spring、struts
- 《JavaScript语言精粹》—— 读书总结
- 视差滚动技术的简介及运用
- 【面试虐菜】—— JAVA面试题(3)
- Carousel 旋转画廊特效的疑难杂症
- 区块链为IBM与Visa等老牌公司注入新的生机
- 【java.lang.UnsupportedClassVersionError】版本不一致出错
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringBoot原理?属性配置?在这里
- 【LeeCode 中等 矩阵】面试题 01.07. 旋转矩阵
- pytest文档44-allure.dynamic动态生成用例标题
- Java自动化测试(TestNg参数化 11)
- 宋宝华:论Linux的页迁移(Page Migration)上集
- 火遍全网的自热火锅哪款最好吃?我们用Python告诉你!
- 剑指offer第10题:矩阵中的路径
- 同事牛逼啊,写了个隐藏 bug,我排查了 3 天才解决问题!
- 使用PyTorch的TensorBoard-可视化深度学习指标 | PyTorch系列(二十五)
- 技术分享 | 只有.frm和.ibd文件时如何批量恢复InnoDB的表
- 14个 JavaScript 代码优化技巧
- 你写注释吗?写你就输了
- 跨端框架模板解析引擎了解一下
- 【Java】基础04:Java虚拟机
- 【Java】基础07:常量、变量和数据类型