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

相关推荐

  • creo旋转水杯零件建模,creo5.0水杯怎么建模

    今天来教大家使用Creo完成下面这个带花纹水杯建模,在这里特别为大家制作了一个简单易学的图文教程,让每个小白都能轻松学会利用CREO快速绘制一个模型!大家也可以使用PROE或Cre…

    2023年 1月 23日
  • 手机网页被劫持跳转怎么办(ipad网页被劫持了怎么修复)

    【1】遇到驱动劫持这种情况,就需要用到【360安全卫士】,用里面的【系统急救】中的【强力模式】,去扫描就可以解决劫持的问题。 【2】在电脑桌面上面找到【360安全卫士】,双击进入。…

    互联网 2023年 3月 24日
  • 新年头像如何制作?手把手教你自制头像图片

    新年头像如何制作?上周我们刚刚过完了圣诞节,也就是国外的新年。转眼间2022年也就到了年末,眼看就要到了新的一年。人们都常说新的一年从头开始。所以我们当然需要给自己的微信、QQ等社…

    2023年 5月 4日
  • 如何做出镂空感觉立体字,特别详细的立体字制作教程

    本节教程将教授如何制作立体镂空字。 只需要一分钟,您就可以学会这项技巧。 首先,使用文字工具输入所需的文字,然后选择文字,点击“效果”菜单,选择“3D”-“凸出和斜角”。 接着,在…

    2023年 10月 21日
  • 新手小白开通蓝v号有什么好处

    今天给大家讲一下蓝v企业认证的好处是什么?包括它的开通流程。 这边有一个增加企业信息对不对?它是可以放你的门店的地址,可以进行一键导流的。 第二个开直播,但是如果你不是企业账号,你…

    2023年 5月 23日
  • 梦幻西游吸附点化石赚钱吗,梦幻西游吸附石赚钱攻略详细

    召唤兽的技能格子,在炼妖成功的那一刻,就已经注定。当拥有技能格子的数量少于4个的时候,才可以通过打书将技能格子顶到4个。而且,对于召唤兽的等级还有一定的要求。但是,再想多顶也不可能…

    2023年 6月 30日
  • 微信附近人别人看不到我怎么解决苹果手机

    有些朋友反映,在微信的附近人功能中可以看到别人,而别人却看不到自己,并且等了很长一段时间,也依然无法被搜到,这是怎么回事呢?今天来讲一讲其中的原因和解决的办法: 原因一:位置权限 …

    2023年 2月 25日
  • 一个excel排班表实例,excel早中晚班排班表

    排班表我想一般连轴转的生产型的企业都会用上,也有不同类型的倒班形式,三班两倒,四班三倒等,这都涉及到排班表的设计。本文是通过实例描述了一种四班两运转的Excel排班表制作。 这天,…

    2023年 4月 15日
  • 家用wifi慢是路由器的问题吗

    家庭WiFi网络承载的业务日益复杂,对WiFi网络的速率、稳定性以及信号覆盖能力的要求也越来越高。但是周围许多朋友都反映家中WiFi不是信号不好就是上网慢,打游戏卡顿、看视频总缓冲…

    2023年 9月 2日
  • 微信商城怎么开通?

    微信商城又可以称为微商城,微信商城是很多商家企业作为线上销售的一个平台,毕竟在微信这个这么高日活量的社交平台上,自然会有很多潜在顾客。那么如果想在微信上卖货的商家企业怎么开通微信商…

    2023年 6月 15日