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 相关文章推荐
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
Python玩转PDF的各种骚操作
May 06 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
Django之提交表单与前后端交互的方法
Jul 19 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 Python
Python二次规划和线性规划使用实例
Dec 09 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
python适合做数据挖掘吗
Jun 16 Python
Python操作Elasticsearch处理timeout超时
Jul 17 Python
python入门学习关于for else的特殊特性讲解
Nov 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
PHP5 的对象赋值机制介绍
2011/08/02 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
理解javascript封装
2016/02/23 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
python迭代器与生成器详解
2016/03/10 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
python实现文件的备份流程详解
2019/06/18 Python
python取余运算符知识点详解
2019/06/27 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
Java程序开发中如何应用线程
2016/03/03 面试题
趣味活动策划方案
2014/02/08 职场文书
升学宴演讲稿
2014/09/01 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
物业接待员岗位职责
2015/04/15 职场文书
升学宴祝酒词
2015/08/11 职场文书
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL