重学。

# coding = utf-8

# 二叉树遍历
class Node:
    """节点类"""
    def __init__(self, element=None, left_child=None, right_child=None):
        self.element = element
        self.left_child = left_child
        self.right_child = right_child

class Tree:
    """树类"""
    def __init__(self):
        self.root = Node()
        self.tree_queue = []

    def add(self, element):
        """为树添加节点"""
        node = Node(element)
        if self.root.element is None:
            self.root = node
            self.tree_queue.append(self.root)
        else:
            tree_node = self.tree_queue[0]
            if tree_node.left_child is None:
                tree_node.left_child = node
                self.tree_queue.append(tree_node.left_child)
            else:
                tree_node.right_child = node
                self.tree_queue.append(tree_node.right_child)
                self.tree_queue.pop(0)

    def front_recursion(self, root):
        """利用递归实现树的先序遍历"""
        if root is None:
            return
        print(root.element, end=' ')
        self.front_recursion(root.left_child)
        self.front_recursion(root.right_child)

    def middle_recursion(self, root):
        """利用递归实现树的中序遍历"""
        if root is None:
            return
        self.middle_recursion(root.left_child)
        print(root.element, end=' ')
        self.middle_recursion(root.right_child)

    def later_recursion(self, root):
        """利用递归实现树的后序遍历"""
        if root is None:
            return
        self.later_recursion(root.left_child)
        self.later_recursion(root.right_child)
        print(root.element, end=' ')

    def front_stack(self, root):
        """利用堆栈实现树的先序遍历"""
        if root is None:
            return
        tree_stack = []
        node = root
        while node or tree_stack:
            while node:
                print(node.element, end=' ')
                tree_stack.append(node)
                node = node.left_child
            node = tree_stack.pop()
            node = node.right_child

    def middle_stack(self, root):
        """利用堆栈实现树的中序遍历"""
        if root is None:
            return
        tree_stack = []
        node = root
        while node or tree_stack:
            while node:
                tree_stack.append(node)
                node = node.left_child
            node = tree_stack.pop()
            print(node.element, end=' ')
            node = node.right_child

    def later_stack(self, root):
        """利用堆栈实现树的后序遍历"""
        if root is None:
            return
        tree_stack_a = []
        tree_stack_b = []
        node = root
        tree_stack_a.append(node)
        while tree_stack_a:
            node = tree_stack_a.pop()
            if node.left_child:
                tree_stack_a.append(node.left_child)
            if node.right_child:
                tree_stack_a.append(node.right_child)
            tree_stack_b.append(node)
        while tree_stack_b:
            print(tree_stack_b.pop().element, end=' ')

    def level_queue(self, root):
        """利用队列实现树的层次遍历"""
        if root is None:
            return
        tree_queue = []
        node = root
        tree_queue.append(node)
        while tree_queue:
            node = tree_queue.pop(0)
            print(node.element, end=' ')
            if node.left_child is not None:
                tree_queue.append(node.left_child)
            if node.right_child is not None:
                tree_queue.append(node.right_child)

if __name__ == '__main__':
    elem_s = range(10)
    # 新建一个二叉树对象
    tree = Tree()
    for elem in elem_s:
        tree.add(elem)

    print('广度优先遍历---队列实现层次遍历:')
    tree.level_queue(tree.root)
    print('\n深度优先遍历---递归实现先序遍历:')
    tree.front_recursion(tree.root)
    print('\n深度优先遍历---递归实现中序遍历:')
    tree.middle_recursion(tree.root)
    print('\n深度优先遍历---递归实现后序遍历:')
    tree.later_recursion(tree.root)
    print('\n深度优先遍历---堆栈实现先序遍历:')
    tree.front_stack(tree.root)
    print('\n深度优先遍历---堆栈实现中序遍历:')
    tree.middle_stack(tree.root)
    print('\n深度优先遍历---堆栈实现后序遍历:')
    tree.later_stack(tree.root)
C:\Users\Sahara\.virtualenvs\test\Scripts\python.exe C:/Users/Sahara/PycharmProjects/test/python_search.py
广度优先遍历---队列实现层次遍历:

深度优先遍历---递归实现先序遍历:

深度优先遍历---递归实现中序遍历:

深度优先遍历---递归实现后序遍历:

深度优先遍历---堆栈实现先序遍历:

深度优先遍历---堆栈实现中序遍历:

深度优先遍历---堆栈实现后序遍历:

Process finished with exit code 

python---二叉树遍历的更多相关文章

  1. Python --- 二叉树的层序建立与三种遍历

    二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有....(此处省略好多字)....等的优良特点. 之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结 ...

  2. python实现二叉树遍历算法

    说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...

  3. Python -二叉树 创建与遍历算法(很详细)

    树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...

  4. 二叉树遍历(非递归版)——python

    二叉树的遍历分为广度优先遍历和深度优先遍历 广度优先遍历(breadth first traversal):又称层次遍历,从树的根节点(root)开始,从上到下从从左到右遍历整个树的节点. 深度优先遍 ...

  5. 算法随笔-二叉树遍历的N种姿势

    最近在练习用Python刷算法,leetcode上刷了快300题.一开始怀疑自己根本不会写代码,现在觉得会写一点点了,痛苦又充实的刷题历程.对我这种半路出家的人而言,收获真的很大. 今天就从二叉树遍历 ...

  6. Python - 二叉树, 堆, headq 模块

    二叉树 概念 二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树), 或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树组成. 特点 每个结点最多有两颗子树,所 ...

  7. python 实时遍历日志文件

    首先尝试使用 python open 遍历一个大日志文件, 使用 readlines() 还是 readline() ? 总体上 readlines() 不慢于python 一次次调用 readlin ...

  8. C++ 二叉树遍历实现

    原文:http://blog.csdn.net/nuaazdh/article/details/7032226 //二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #includ ...

  9. 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历

    [二叉树遍历模版]前序遍历     1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...

  10. hdu 4605 线段树与二叉树遍历

    思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...

随机推荐

  1. 作业二:Git的安装与使用

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 分布式版本控制系统Git的安装与使用 1.下载安装配置用户名 ...

  2. Lua语言自学之01.基础概念的理解

    编程不只是这么简单,它的思维是理性的编程思维,操纵机器干事本来就不是一件简单的事,要干什么,该怎么做,怎么做得才好. 脚本的概念在程序中十分重要,在游戏开发领域,它更是决定性的.脚本语言让程序员可以区 ...

  3. mybatis操作mysql的奇淫技巧总结(代码库)

    1.添加公共sql代码段 使用<sql> 和 <include> 标签 <sql id="userSubassemblyRecordParam"> ...

  4. nginx编译安装指定参数

    --prefix=/app/nginx # 安装目录 --conf-path=/app/nginx/conf/nginx.conf # 配置文件 --sbin-path=/app/nginx/sbin ...

  5. The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror) B"Even Number Theory"(找规律???)

    传送门 题意: 给出了三个新定义: E-prime : ∀ num ∈ E,不存在两个偶数a,b,使得 num=a*b;(简言之,num的一对因子不能全为偶数) E-prime factorizati ...

  6. echarts 修改y轴name的样式

    option = {    xAxis: {        type: 'category',        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sa ...

  7. Python变量命名规范

    模块名: 小写字母,单词之间用_分割 ad_stats.py 包名: 和模块名一样 类名: 单词首字母大写 AdStats ConfigUtil 全局变量名(类变量,在java中相当于static变量 ...

  8. 第一节:.Net版基于WebSocket的聊天室样例

    一. 说在前面的话 该篇文章为实时通讯系列的第一节,基于WebSocket编写了一个简易版聊天样例,主要作用是为引出后面SignalR系列的用法及其强大方便之处,通过这个样例与后续的SignalR对比 ...

  9. js中的简单数据类型和复杂数据类型的存储

    基本类型存储的是值而复杂数据类型也叫引用类型存储的是对象的地址如0x00001而在栈中存的是变量数值和函数参数 堆中存的是对象和数组 堆栈空间分配 栈(操作系统):由操作系统自动分配释放 ,存放函数的 ...

  10. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...