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使用socket连接远程服务器的方法
Apr 29 Python
Python定时执行之Timer用法示例
May 27 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
python正则表达式re之compile函数解析
Oct 25 Python
Python 实现选择排序的算法步骤
Apr 22 Python
Pycharm设置界面全黑的方法
May 23 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
python爬虫模拟浏览器的两种方法实例分析
Dec 09 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
Python通过Schema实现数据验证方式
Nov 12 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 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
什么是MVC,好东西啊
2007/05/03 PHP
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
发现的以前不知道的函数
2006/09/19 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
学习python处理python编码问题
2011/03/13 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Django model select的多种用法详解
2019/07/16 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
Pycharm Git 设置方法
2020/09/15 Python
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
三方股份合作协议书
2014/10/13 职场文书
市场营销计划书
2015/01/17 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
无房证明样本
2015/06/17 职场文书
外科护士长工作总结
2015/08/12 职场文书
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript