python实现二叉树中序遍历

Python 实现二叉树前序,中序,后序,层次遍历

技术博客: ***/yongxinz/tech-blog

Python 实现二叉树前序,中序,后序,层次遍历

树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效率,如哈弗曼树。

用 Python 实现树的构造和几种遍历算法。实现功能如下:

  • 树的构造
  • 递归实现先序遍历、中序遍历、后序遍历
  • 堆栈实现先序遍历、中序遍历、后序遍历
  • 队列实现层次遍历
# -*- coding=utf-8 -*-class Node(object): """节点类""" def __init__(self, element=-1, l_child=None, r_child=None): self.element = element self.l_child = l_child self.r_child = r_childclass Tree(object): """树类""" def __init__(self): self.root = Node() self.queue = [] def add_node(self, element): """为树添加节点""" node = Node(element) # 如果树是空的,则对根节点赋值 if self.root.element == -1: self.root = node self.queue.append(self.root) else: tree_node = self.queue[0] # 此结点没有左子树,则创建左子树节点 if tree_node.l_child is None: tree_node.l_child = node self.queue.append(tree_node.l_child) else: tree_node.r_child = node self.queue.append(tree_node.r_child) # 如果该结点存在右子树,将此节点丢弃 self.queue.pop(0) def front_recursion(self, root): """利用递归实现树的前序遍历""" if root is None: return print root.element, self.front_recursion(root.l_child) self.front_recursion(root.r_child) def middle_recursion(self, root): """利用递归实现树的中序遍历""" if root is None: return self.middle_recursion(root.l_child) print root.element, self.middle_recursion(root.r_child) def back_recursion(self, root): """利用递归实现树的后序遍历""" if root is None: return self.back_recursion(root.l_child) self.back_recursion(root.r_child) print root.element, @staticmethod def front_stack(root): """利用堆栈实现树的前序遍历""" if root is None: return stack = [] node = root while node or stack: # 从根节点开始,一直找它的左子树 while node: print node.element, stack.append(node) node = node.l_child # while结束表示当前节点node为空,即前一个节点没有左子树了 node = stack.pop() # 开始查看它的右子树 node = node.r_child @staticmethod def middle_stack(root): """利用堆栈实现树的中序遍历""" if root is None: return stack = [] node = root while node or stack: # 从根节点开始,一直找它的左子树 while node: stack.append(node) node = node.l_child # while结束表示当前节点node为空,即前一个节点没有左子树了 node = stack.pop() print node.element, # 开始查看它的右子树 node = node.r_child @staticmethod def back_stack(root): """利用堆栈实现树的后序遍历""" if root is None: return stack1 = [] stack2 = [] node = root stack1.append(node) # 这个while循环的功能是找出后序遍历的逆序,存在stack2里面 while stack1: node = stack1.pop() if node.l_child: stack1.append(node.l_child) if node.r_child: stack1.append(node.r_child) stack2.append(node) # 将stack2中的元素出栈,即为后序遍历次序 while stack2: print stack2.pop().element, @staticmethod def level_queue(root): """利用队列实现树的层次遍历""" if root is None: return queue = [] node = root queue.append(node) while queue: node = queue.pop(0) print node.element, if node.l_child is not None: queue.append(node.l_child) if node.r_child is not None: queue.append(node.r_child)if __name__ == '__main__': """主函数""" # 生成十个数据作为树节点 elements = range(10) tree = Tree() for elem in elements: tree.add_node(elem) print '队列实现层次遍历:' tree.level_queue(tree.root) print 'nn递归实现前序遍历:' tree.front_recursion(tree.root) print 'n递归实现中序遍历:' tree.middle_recursion(tree.root) print 'n递归实现后序遍历:' tree.back_recursion(tree.root) print 'nn堆栈实现前序遍历:' tree.front_stack(tree.root) print 'n堆栈实现中序遍历:' tree.middle_stack(tree.root) print 'n堆栈实现后序遍历:' tree.back_stack(tree.root)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 9月 22日 下午3:16
下一篇 2023年 9月 22日 下午3:35

相关推荐

  • 怎么隐藏电脑桌面任务栏图标(任务栏qq图标隐藏了怎么弄出来)

    把电脑桌面底部任务栏和桌面图标及桌面文件都设置没有,看起来是不是很有个性,暂时隐藏桌面文件作用也是挺大的,那么我们来看看如何设置: 一:隐藏电脑桌面底部任务栏的设置; 1.在电脑桌…

    2023年 3月 27日
  • word段落左侧的黑点点是干嘛的

    word段落左侧的小黑点是干嘛的呢? 样例文字: 应用标题1,标题2,标题3样式后,段落左侧显示这样一个黑点点。 只有点亮"显示和隐藏标记",才会显示该黑点点。…

    2023年 6月 8日
  • 舞蹈常用专业术语,必须收藏!(舞蹈常用专业术语)

    在学习舞蹈的过程中,我们经常会听到老师说,注意节奏、注意身段、注意舞蹈动作等各类舞蹈专业术语…… 然而作为一个舞蹈小白,你是不是听得一头雾水,完全不明白老师…

    2023年 7月 6日
  • 球球大作战黄颜色的名字怎么弄?

    在球球大作战中,我们可以在自己的昵称上加上一些特殊的符号,让自己的名字更有特色,那如何在名字中加上皇冠符号呢?下面小c就给大家分享一下皇冠符号的设置方法,一起来看看吧。 球球大作战…

    2023年 5月 8日
  • 2022新版qq怎么关闭qq看点

    今天主要说的就是qq看点,有些人觉得这个看着不舒服,因为是新版后来更新以后,添加的一个功能,今天来看一下怎么关闭它。 方法/步骤 这个qq看点是哪个呢?就是你打开qq以后,在手机q…

    2022年 12月 27日
  • 银河麒麟系统安装第三方软件

    简述:最近有项目需求准备将windows平台的工控主机换成国产软硬件,然后搞了一套国产飞腾的硬件,价格真香!早几年有在x86上玩过ubtunu、deepin等,现在换成国产就感觉挻…

    2023年 5月 22日
  • 游戏类目如何入驻天猫

    天猫商城里面的类目有很多,可以说是生活中需要的东西天猫上都能找到。最近放暑假了,不少网瘾少年们窝在家或者网吧打游戏,可谓是很放松了。 游戏类目应该怎样入驻天猫? 有很多商家朋友们都…

    2023年 6月 16日
  • ios怎么用油猴插件免费看vip

    你是不是经常在网上看视频的时候,被各种广告和会员限制所困扰?你是不是想要免费观看爱奇艺、优酷、腾讯视频等在线视频平台的VIP内容,却又不想花钱买会员?你是不是想要一款能够让你一键破…

    2023年 8月 15日
  • google recaptcha 验证码

    Kaptcha是google的一个验证码插件,可以集成spring中,使用很方便,但是他的属性要一定清楚 kaptcha可配置项: kaptcha.border 是否有边框 默认为…

    互联网 2023年 5月 25日
  • 腾讯视频格式怎么转换成mp4格式工厂

    我们平时在编辑视频的时候,有时候会需要改变它的视频格式,MP4和VOB都是常见的视频格式,那么你知道怎么将这两种视频格式进行转换吗?今天小编就为大家精心准备了三个MP3转VOB的方…

    2022年 12月 20日