python数据结构之二叉树的遍历实例


Posted in Python onApril 29, 2014

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

有次序:
    NLR、LNR、LRN

遍历的命名

    根据访问结点操作发生位置命名:
NLR:前序遍历(PreorderTraversal亦称(先序遍历))  ——访问结点的操作发生在遍历其左右子树之前。
LNR:中序遍历(InorderTraversal)  ——访问结点的操作发生在遍历其左右子树之中(间)。
LRN:后序遍历(PostorderTraversal)    ——访问结点的操作发生在遍历其左右子树之后。

注:由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

遍历算法

1).先序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
a.访问根结点
b.遍历左子树
c.遍历右子树

2).中序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
a.遍历左子树
b.访问根结点
c.遍历右子树

3).后序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
a.遍历左子树
b.遍历右子树
c.访问根结点

一、二叉树的递归遍历:

# -*- coding: utf - 8 - *-
class TreeNode(object):
    def __init__(self, left=0, right=0, data=0):
        self.left = left
        self.right = right
        self.data = data
     
class BTree(object):
    def __init__(self, root=0):
        self.root = root
    def is_empty(self):
        if self.root is 0:
            return True
        else:
            return False
    def preorder(self, treenode):
        '前序(pre-order,NLR)遍历'
        if treenode is 0:
            return
        print treenode.data
        self.preorder(treenode.left)
        self.preorder(treenode.right)
    def inorder(self, treenode):
        '中序(in-order,LNR'
        if treenode is 0:
            return
        self.inorder(treenode.left)
        print treenode.data
        self.inorder(treenode.right)
    def postorder(self, treenode):
        '后序(post-order,LRN)遍历'
        if treenode is 0:
            return
        self.postorder(treenode.left)
        self.postorder(treenode.right)
        print treenode.data
     
node1 = TreeNode(data=1)
node2 = TreeNode(node1, 0, 2)
node3 = TreeNode(data=3)
node4 = TreeNode(data=4)
node5 = TreeNode(node3, node4, 5)
node6 = TreeNode(node2, node5, 6)
node7 = TreeNode(node6, 0, 7)
node8 = TreeNode(data=8)
root = TreeNode(node7, node8, 'root')
bt = BTree(root)
print u'''
#生成的二叉树
# ------------------------
#          root
#       7        8
#     6
#   2   5
# 1    3 4
#
# -------------------------
'''
print '前序(pre-order,NLR)遍历 :\n'
bt.preorder(bt.root)
print '中序(in-order,LNR) 遍历 :\n'
bt.inorder(bt.root)
print '后序(post-order,LRN)遍历 :\n'
bt.postorder(bt.root)

二、.二叉树的非递归遍历

下面就用非递归的方式实现一遍。主要用到了 stack 和 queue维护一些数据节点:

# -*- coding: utf - 8 - *-     
class TreeNode(object):
    def __init__(self, left=0, right=0, data=0):
        self.left = left
        self.right = right
        self.data = data
     
class BTree(object):
    def __init__(self, root=0):
        self.root = root
    def is_empty(self):
        if self.root is 0:
            return True
        else:
            return False
    def preorder(self, treenode):
        '前序(pre-order,NLR)遍历'
        stack = []
        while treenode or stack:
            if treenode is not 0:
                print treenode.data
                stack.append(treenode)
                treenode = treenode.left
            else:
                treenode = stack.pop()
                treenode = treenode.right
    def inorder(self, treenode):
        '中序(in-order,LNR) 遍历'
        stack = []
        while treenode or stack:
            if treenode:
                stack.append(treenode)
                treenode = treenode.left
            else:
                treenode = stack.pop()
                print treenode.data
                treenode = treenode.right
    # def postorder(self, treenode):
    #     stack = []
    #     pre = 0
    #     while treenode or stack:
    #         if treenode:
    #             stack.append(treenode)
    #             treenode = treenode.left
    #         elif stack[-1].right != pre:
    #             treenode = stack[-1].right
    #             pre = 0
    #         else:
    #             pre = stack.pop()
    #             print pre.data
    def postorder(self, treenode):
        '后序(post-order,LRN)遍历'
        stack = []
        queue = []
        queue.append(treenode)
        while queue:
            treenode = queue.pop()
            if treenode.left:
                queue.append(treenode.left)
            if treenode.right:
                queue.append(treenode.right)
            stack.append(treenode)
        while stack:
            print stack.pop().data
    def levelorder(self, treenode):
        from collections import deque
        if not treenode:
            return
        q = deque([treenode])
        while q:
            treenode = q.popleft()
            print treenode.data
            if treenode.left:
                q.append(treenode.left)
            if treenode.right:
                q.append(treenode.right)
     
node1 = TreeNode(data=1)
node2 = TreeNode(node1, 0, 2)
node3 = TreeNode(data=3)
node4 = TreeNode(data=4)
node5 = TreeNode(node3, node4, 5)
node6 = TreeNode(node2, node5, 6)
node7 = TreeNode(node6, 0, 7)
node8 = TreeNode(data=8)
root = TreeNode(node7, node8, 'root')
     
bt = BTree(root)
print u'''
#生成的二叉树
# ------------------------
#          root
#       7        8
#     6
#   2   5
# 1    3 4
#
# -------------------------
'''
print '前序(pre-order,NLR)遍历 :\n'
bt.preorder(bt.root)
print '中序(in-order,LNR) 遍历 :\n'
bt.inorder(bt.root)
print '后序(post-order,LRN)遍历 :\n'
bt.postorder(bt.root)
print '层序(level-order,LRN)遍历 :\n'
bt.levelorder(bt.root)
Python 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
Python实现115网盘自动下载的方法
Sep 30 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Tensorflow卷积神经网络实例
May 24 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
python opencv摄像头的简单应用
Jun 06 Python
在交互式环境中执行Python程序过程详解
Jul 12 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
几款好用的python工具库(小结)
Oct 20 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 Python
python数据结构之二叉树的建立实例
Apr 29 #Python
python数据结构树和二叉树简介
Apr 29 #Python
Python的ORM框架SQLAlchemy入门教程
Apr 28 #Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 #Python
Python的ORM框架SQLObject入门实例
Apr 28 #Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 #Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 #Python
You might like
php利用反射实现插件机制的方法
2015/03/14 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
2016/08/15 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
JS实现横向跑马灯效果代码
2020/04/20 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python中pygame模块用法实例
2014/10/09 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
电信专业毕业生推荐信
2013/11/18 职场文书
测试工程师职业规划书
2014/02/06 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
庆七一宣传标语
2014/10/08 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
《观潮》教学反思
2016/02/17 职场文书
高中历史教学反思
2016/02/19 职场文书