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写的服务监控程序实例
Jan 31 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
Python绘制热力图示例
Sep 27 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
python快速排序的实现及运行时间比较
Nov 22 Python
python如何调用字典的key
May 25 Python
Python如何在循环内使用list.remove()
Jun 01 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 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
一个目录遍历函数
2006/10/09 PHP
隐性调用php程序的方法
2009/03/09 PHP
浅析PHP Socket技术
2013/08/02 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
PHP 使用二进制保存用户状态的实例
2018/01/29 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
迟到检讨书大全
2014/01/25 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
成事在人观后感
2015/06/16 职场文书
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python