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

  • 广度优先遍历(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. 定时显示提示信息(TToolTip)

    { 修改者:ghs 日期:20071218 功能:在原版本的基础上增加. RegisterControl:注册需要提示的控件. BeginHelp:设置光标状态为帮助crHelp: 鼠标弹起后,显示注 ...

  2. attribute__关键字举例之visibility

    /** @file visibilityT.c * @note * @brief * @author * @date 2019-6-20 * @note v1.0.0 Created * @histo ...

  3. linux中解决出现:^H^H^H^H

    解决出现:^H^H^H^H 把stty erase ^H 添加到.bash_profile中 vim /etc/profile stty erase ^H su root source /etc/pr ...

  4. 【pod无法删除 总是处于terminate状态】强行删除pod

    加参数 --force --grace-period=0,grace-period表示过渡存活期,默认30s,在删除POD之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止POD ku ...

  5. 使用JSQLParser解析SQL中涉及到的表

    首先添加Maven依赖: <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId& ...

  6. TS - 问题解决力 - 下篇

    本文是已读书籍的内容摘要,少部分有轻微改动,但不影响原文表达. <麦肯锡工作法 - 个人竞争力提升50%的7堂课> ISBN: 9787508644691 https://book.dou ...

  7. Asp.Net Core Identity中基于角色授权

    我们已经在之前介绍了简单的授权是在Controller或Action上添加属性Authorize来实现,那角色授权是在指定Authorize的同时指定Roles参数. 我们来看看基于角色访问的三种方式 ...

  8. win10 linux Ubuntu 18.04更换国内源

    安装了win10的linux bash 版本为ubuntu 18.04 首先查询自己的linux版本信息 cat /etc/issue   然后对系统的镜像源文件进行备份,再修改镜像源文件/etc/a ...

  9. CentOS下使用yum安装Apache极为方便,只需要在终端键入以下命令即可

    CentOS下使用yum安装Apache极为方便,只需要在终端键入以下命令即可 1.安装Apache yum install httpd 2.设置服务器开机自动启动Apache systemctl e ...

  10. 高可用etcd集群(三节点) + ssl双向认证

    # etcd下载地址 https://github.com/etcd-io/etcd/tags wget https://github.com/etcd-io/etcd/releases/downlo ...