#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon May 13 15:48:30 2019@author: lg
"""class Node():#节点类def __init__(self,data = -1):self.data = dataself.left = Noneself.right = None
class Tree():#树类def __init__(self):self.root = Node()def add(self,data):# 为树加入节点node  = Node(data)if self.root.data == -1:        #如果树为空,就对根节点赋值self.root = nodeelse:myQueue = []treeNode = self.rootmyQueue.append(treeNode)while myQueue:              #对已有的节点进行层次遍历treeNode = myQueue.pop(0)if not treeNode.left:treeNode.left = nodereturnelif not treeNode.right:treeNode.right = nodereturnelse:myQueue.append(treeNode.left)myQueue.append(treeNode.right)def pre_order_recursion(self,root):     #递归实现前序遍历if not root:returnprint( root.data,)self.pre_order_recursion(root.left)self.pre_order_recursion(root.right)def pre_order_stack(self,root):         #堆栈实现前序遍历(非递归)if not root:returnmyStack = []node = rootwhile myStack or node:while node:       #从根节点开始,一直寻找他的左子树print (node.data,)myStack.append(node)node = node.leftnode = myStack.pop()    #while结束表示当前节点node为空,即前一个节点没有左子树了node = node.right       #开始查看它的右子树def in_order_recursion(self,root):      #递归实现中序遍历if not root:returnself.in_order_recursion(root.left)print( root.data,)self.in_order_recursion(root.right)def in_order_stack(self,root):        #堆栈实现中序遍历(非递归)if not root:returnmyStack = []node = rootwhile myStack or node:     #从根节点开始,一直寻找它的左子树while node:myStack.append(node)node = node.leftnode = myStack.pop()print(node.data,)node = node.rightdef post_order_recursion(self,root):     #递归实现后序遍历if not root:returnself.post_order_recursion(root.left)self.post_order_recursion(root.right)print( root.data,)def post_order_stack(self, root):  # 堆栈实现后序遍历(非递归)# 先遍历根节点,再遍历右子树,最后是左子树,这样就可以转化为和先序遍历一个类型了,最后只把遍历结果逆序输出就OK了。if not root:returnmyStack1 = []myStack2 = []node = rootwhile myStack1 or node:while node:myStack2.append(node)myStack1.append(node)node = node.rightnode = myStack1.pop()node = node.leftwhile myStack2:print( myStack2.pop().data,)def level_order_queue(self,root):       #队列实现层次遍历(非递归)if not root :returnmyQueue = []node = rootmyQueue.append(node)while myQueue:node = myQueue.pop(0)print( node.data,)if node.left:myQueue.append(node.left)if node.right:myQueue.append(node.right)if __name__ == '__main__':#主函数datas = [2,3,4,5,6,7,8,9]tree = Tree()          #新建一个树对象for data in datas:tree.add(data)      #逐个加入树的节点print ('递归实现前序遍历:')tree.pre_order_recursion(tree.root)print( '\n堆栈实现前序遍历')tree.pre_order_stack(tree.root)print ("\n\n递归实现中序遍历:")tree.in_order_recursion(tree.root)print ("\n堆栈实现中序遍历:")tree.in_order_stack(tree.root)print ('\n\n递归实现后序遍历:')tree.post_order_recursion(tree.root)print('\n堆栈实现后序遍历:')tree.post_order_stack(tree.root)print('\n\n队列实现层次遍历:')tree.level_order_queue(tree.root)

python 二叉树遍历相关推荐

  1. python二叉树遍历算法_分享python实现的二叉树定义与遍历

    这篇文章主要介绍了python实现的二叉树定义与遍历算法,结合具体实例形式分析了基于Python定义的二叉树及其常用遍历操作实现技巧,需要的朋友可以参考下 本文实例讲述了python实现的二叉树定义与 ...

  2. Python二叉树遍历

    树的遍历是树的一种重要的运算.所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal).那么树的两种重要的遍历模式是深 ...

  3. python二叉树遍历例子_python数据结构之二叉树的遍历实例

    遍历方案   从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作: 1).访问结点本身(N) 2).遍历该结点的左子树( ...

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

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

  5. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

  6. python 递归遍历二叉树

    python 递归遍历二叉树 我确定很多人不能真正的理解二叉树-- class Node: def __init__(self,value=0,left=0,right=0): self.value= ...

  7. Python二叉树的三种深度优先遍历

    Python二叉树的三种深度优先遍历 一.广度优先遍历和深度优先遍历 对二叉树进行遍历(traversal)是指依次对树中每个节点进行访问,在遍历的过程中实现需要的业务. 对树的遍历方式有广度优先遍历 ...

  8. Python:二叉树遍历

    二叉树遍历共有四种方法,分别是前序遍历.中序遍历.后序遍历和层次遍历. 前序遍历: 父节点--左孩子--右孩子 中序遍历:左孩子--父节点--右孩子 后序遍历:左孩子--右孩子--父节点 层次遍历:利 ...

  9. python 二叉树的序列化和反序列化

    python 二叉树的序列化和反序列化 一.leetcode 297 二.为什么要反序列化? 三.反序列化设计 四.序列化设计 五.leetcode 297题 一.leetcode 297 序列化是将 ...

最新文章

  1. row number mysql_MySQL中的ROW_NUMBER()
  2. 电话连线(最小生成树)
  3. vagrant学习笔记 - 基本命令的使用
  4. ftl保存成html中文是乱码,解决freemarker生成静态页面时乱码问题
  5. vue3 数据双向绑定demo
  6. 还有哪些类似0.99999…=1有趣的事实?
  7. 【项目总结】达能益力--官网
  8. 层净高怎么算_层高和净高怎么算,标准是多少?
  9. 操作argc, argv的经典写法
  10. 10、Android--技巧
  11. Proxifier全局代理软件,其提供了跨平台的端口转发和代理功能
  12. nginx重启后出现[error] open() “/usr/local/var/run/nginx/nginx.pid” failed
  13. Python并发编程相关及在爬虫实战中的使用
  14. WebRTC视频码率控制(一)—— CPU使用度检测
  15. firewalld防火墙配置ip地址伪装和端口转发
  16. Completed 404 NOT_FOUND,Whitelabel Error Page
  17. office打不开文件,显示需要修复文件,点击修复也没用的解决办法
  18. mysql如何插入图片和视频_mysql中怎样插入图片
  19. oracle中转换函数,Oracle中的转换函数
  20. 全球直播的罗胖跨年演讲背后技术支撑故事——罗辑思维首席架构师方圆访谈...

热门文章

  1. 小Z的房间[HEOI2015] (matrix-tree定理)
  2. 常见问题一之项目报错排查
  3. linux 系统负载
  4. 为什么泪水充满了我的眼眶,那是一种从未有过的感伤,
  5. syslog记录history历史记录
  6. Android:理想的框架开发母板——高焕堂
  7. .bashrc文件在哪?
  8. github入门必备概念
  9. php 命名空间地址,php命名空间简介
  10. java 进程100_原创:如何排查java进程cpu100%的问题