二叉树的遍历分为广度优先遍历和深度优先遍历

  • 广度优先遍历(breadth first traversal):又称层次遍历,从树的根节点(root)开始,从上到下从从左到右遍历整个树的节点。
  • 深度优先遍历(depth first traversal):对于一颗二叉树,深度优先遍历是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。深度优先遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder):根节点->左子树->右子树,中序遍历(inorder):左子树->根节点->右子树,和后序遍历(postorder):左子树->右子树->根节点。这三种都是递归方式实现对一整个二叉树遍历的哦。

  • 代码(非递归版)
  • class TreeNode:
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    class Trees:    #根据前序和中序列表来重建二叉树
        def reConstructBinaryTree(self, pre, tin):
            # write code here
            if len(pre) == 0:
                return None
            if len(pre) == 1:
                return TreeNode(pre[0])
            else:
                flag = TreeNode(pre[0])
                flag.left = self.reConstructBinaryTree(pre[1:tin.index(pre[0])+1],tin[:tin.index(pre[0])])
                flag.right = self.reConstructBinaryTree(pre[tin.index(pre[0])+1:],tin[tin.index(pre[0])+1:])
            return flag
        #前序遍历
        def preOrder(self, root):
            if root == None:
                return
            stack = []
            result = []
            node = root
            while node or stack:
                while node:
                    # 从根节点开始,一直找它的左子树
                    result.append(node.val)
                    stack.append(node)
                    node = node.left
                # while结束表示当前节点node为空,即前一个节点没有左子树了
                node = stack.pop()
                # 开始查看它的右子树
                node = node.right
            return result
        #中序遍历
        def inOrder(self,root):
            if root == None:
                return
            stack = []
            result = []
            node = root
            while node or stack:
                while node:
                    # 从根节点开始,一直找到左子树
                    stack.append(node)
                    node = node.left
                # while结束表示当前节点node为空,即前一个节点没有左子树了
                node = stack.pop()
                result.append(node.val)
                node = node.right
            return result
        #后序遍历
        def postOrder(self, root):
            if root == None:
                return
            stack = []
            result = []
            node = root
            while node or stack:
                while node:
                    # 从根节点开始,一直找它的右子树
                    result.insert(0,node.val)
                    stack.append(node)
                    node = node.right
                # while结束表示当前节点node为空,即前一个节点没有右子树了
                node = stack.pop()
                # 开始查看它的左子树
                node = node.left
            return result
        #广度优先遍历(即层次遍历)
        def breadthFirstTravel(self,root):
            if root == None:
                return
            queue = [root]
            result = []
            while queue:
                node = queue.pop(0)
                result.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            return result   
    
    pre = [1,2,4,8,5,3,6,7]
    tin = [8,4,2,5,1,6,3,7]
    pos = [8,4,5,2,6,7,3,1]
    
    demo = Trees()
    Nroot = demo.reConstructBinaryTree(pre,tin)
    print(demo.preOrder(Nroot))
    print(demo.inOrder(Nroot))
    print(demo.postOrder(Nroot))
    print(demo.breadthFirstTravel(Nroot))

    前序和中序遍历的结构基本相似,前序遍历的顺序是"根左右",从根节点一直向左找到最左的叶子结点,再依次从下往上路径上结点的右子树。

  • 中序遍历的顺序是“左根右”,从根节点一直向左找到最左的叶子结点,先访问其右子树,再一次沿着路径向上到根节点,之后是根几点的右子树。
  • 后续遍历的顺序是“左右根”,不好遍历,从左节点到右节点是“跳过去的”,换种方法,先把遍历顺序反过来——“根右左”,这种顺序熟悉,就把前序遍历的node.left与node.right交换就可以了,得到的遍历顺序表与后续遍历的顺序表应该是相反的,故可以在列表增加元素的时候反过来或者最后使用list.reverse().
  • 广度优先遍历就是从上往下,从左往右打印,利用队列先入先出,若把同一行的结点放在一起,在里边需要再增加一个临时列表。

参照链接:

  https://blog.csdn.net/John_xyz/article/details/79342846

  https://blog.csdn.net/zzfightingy/article/details/86742755

二叉树遍历(非递归版)——python的更多相关文章

  1. K:二叉树的非递归遍历

    相关介绍:  二叉树的三种遍历方式(先序遍历,中序遍历,后序遍历)的非递归实现,虽然递归方式的实现较为简单且易于理解,但是由于递归方式的实现受其递归调用栈的深度的限制,当递归调用的深度超过限制的时候, ...

  2. ZT 二叉树的非递归遍历

    ZT 二叉树的非递归遍历 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就 是递归定 ...

  3. ZT 二叉树先序,中序,后序遍历非递归实现

    二叉树先序,中序,后序遍历非递归实现 分类: 数据结构及算法2012-04-28 14:30 8572人阅读 评论(6) 收藏 举报 structc 利用栈实现二叉树的先序,中序,后序遍历的非递归操作 ...

  4. 二叉树遍历,递归,栈,Morris

    一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 |  分类:数据结构 |  标 ...

  5. UOJ34 多项式乘法(非递归版)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. java二叉树遍历——深度优先(DFS)与广度优先(BFS) 递归版与非递归版

    介绍 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止. 广度优先遍历:从根节点出发,在横向遍历二叉 ...

  7. [Alg] 二叉树的非递归遍历

    1. 非递归遍历二叉树算法 (使用stack) 以非递归方式对二叉树进行遍历的算法需要借助一个栈来存放访问过得节点. (1) 前序遍历 从整棵树的根节点开始,对于任意节点V,访问节点V并将节点V入栈, ...

  8. [转载]Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)

    本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: 1. O(1)空间复杂度,即只能使用常数空间: 2. 二叉树的形状不能被破坏(中间过程允许改变其形状). 通常,实现二叉树的前序(pr ...

  9. 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

随机推荐

  1. ecshop数据表结构说明

    深深地看看这个吧,会很有帮助的... ecs_account_log 用户帐号情况记录表,包括资金和积分等 log_id mediumint 自增ID号user_id mediumint 用户登录后保 ...

  2. C# 文档注释规范

    C# 提供一种机制,使程序员可以使用含有 XML 文本的特殊注释语法为他们的代码编写文档.在源代码文件中,具有某种格式的注释可用于指导某个工具根据这些注释和它们后面的源代码元素生成 XML.使用这类语 ...

  3. 十篇TED点击率最高演讲,带你重新认识大数据与人工智能

    我们通常过于专注于机器学习算法的实现,倾向于忽略这种技术本身的一些重要问题:如未来的应用和政治后果.在这篇文章中,我们从非常受欢迎的非营利组织TED上收集了一系列的视频(并非关注于选择什么语言或算法来 ...

  4. Java创建线程的两种方法

    大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...

  5. Reids原理之IO模型

    众所周知Redis是单进程单线程的应用,在如今多核横行的时代,我们不免有疑问,单线程的redis怎么就成了高性能的代表 当有多个线程同时调用redis的时候,那么单线程的redis是怎么处理的呢,这里 ...

  6. hdu 6609 区间条件前缀和 + 二分

    题目传送门//res tp hdu 目的 在尾部逐步插入n个元素,求插入第i个元素时,[1,i)内删去多少个元素,可使前缀和[1,i]不大于m 多测Q [1,15] n [1,2e5] m [1,1e ...

  7. Java字符串定义及常用方法

    String.StringBuffer和StringBuilder   String修饰的是不可变的字符串,而StringBuffer和StringBuilder类的对象是可以被修改的.   Stri ...

  8. Hbuilder环境下配置php

    XAMPP的安装 https://blog.csdn.net/qing666888/article/details/81914389 安装并配置好Xampp后,在Hbuilder中下载php插件,工具 ...

  9. nmap使用帮助翻译

    Nmap 7.60 ( https://nmap.org )Usage: nmap [扫描类型] [操作] {目标说明}目标说明:  可以识别主机名.IP地址.网络,等等.  例如: scanme.n ...

  10. 淘宝API总结

    1. 淘宝客API https://open.alimama.com/?spm=a219t.11816995.1998910419.d8546b700.2a8f75a5C0NajI#!/documen ...