本文实例讲述了Python二叉树的定义及常用遍历算法。分享给大家供大家参考,具体如下:
说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法。但作为一个有理想有追求的程序员。也应该学学非递归算法实现二叉树遍历。二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开。
以下直入主题:
定义一颗二叉树,请看官自行想象其形状,
class BinNode( ): def __init__( self, val ): self.lchild = None self.rchild = None self.value = val binNode1 = BinNode( 1 ) binNode2 = BinNode( 2 ) binNode3 = BinNode( 3 ) binNode4 = BinNode( 4 ) binNode5 = BinNode( 5 ) binNode6 = BinNode( 6 ) binNode1.lchild = binNode2 binNode1.rchild = binNode3 binNode2.lchild = binNode4 binNode2.rchild = binNode5 binNode3.lchild = binNode6
先序遍历:
''' 先序遍历二叉树 ''' def bin_tree_pre_order_traverse( root, visit_func ): s = Stack() s.push( root ) while not s.is_empty(): node = s.pop() visit_func( node ) if node.rchild: s.push( node.rchild ) if node.lchild: s.push( node.lchild )
中序遍历:
''' 中序遍历二叉树 ''' def bin_tree_in_order_traverse( root, visit_func ): s = Stack() node = root while node or not s.is_empty(): if node: s.push( node ) node = node.lchild else: node = s.pop() visit_func( node ) node = node.rchild
后序遍历:
后序遍历中,要保证左孩子和右孩子都已被访问才能访问根结点,并且左孩子需在右孩子前访问,这就为流程的控制带来了难题。下面介绍两种思路。
思路一,双栈法,这种方式比较容易理解,缺点是需要两个栈。
''' 后序遍历二叉树 ''' def bin_tree_post_order_traverse( root, visit_func ): s1 = Stack() s2 = Stack() s1.push( root ) while not s1.is_empty(): node = s1.pop() s2.push( node ) if node.lchild: s1.push( node.lchild ) if node.rchild: s1.push( node.rchild ) while not s2.is_empty(): visit_func( s2.pop() )
思路二,要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
def bin_tree_post_order_traverse2( root, visit_func ): curr = root prev = None s = Stack() s.push( curr ) while not s.is_empty(): curr = s.peek() if ( not curr.lchild and not curr.rchild ) or ( prev and ( prev == curr.lchild or prev == curr.rchild ) ): visit_func( curr ) s.pop() prev = curr else: if curr.rchild: s.push( curr.rchild ) if curr.lchild: s.push( curr.lchild )
层序遍历:
def bin_tree_level_traverse( root, visit_func ): queue = Queue() queue.enqueue( root ) while not queue.is_empty(): node = queue.dequeue().value visit_func( node ) if node.lchild: queue.enqueue( node.lchild ) if node.rchild: queue.enqueue( node.rchild )
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]