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 深入理解yield
Sep 06 Python
python和shell变量互相传递的几种方法
Nov 20 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
python实现flappy bird游戏
Dec 24 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
对django中foreignkey的简单使用详解
Jul 28 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
python 使用三引号时容易犯的小错误
Oct 21 Python
python中使用np.delete()的实例方法
Feb 01 Python
分析Python list操作为什么会错误
Nov 17 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加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
angular4自定义组件详解
2017/09/28 Javascript
jquery实现动态添加附件功能
2018/10/23 jQuery
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
python实现贪吃蛇双人大战
2020/04/18 Python
物流管理专业大学生自荐信
2013/10/04 职场文书
公益活动策划方案
2014/01/09 职场文书
表扬信格式
2014/01/12 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python