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

  • 广度优先遍历(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. Delphi 中使用计算出的字段

    在很多情况下,我们需要的数据与数据库中其它字段的数据相关,例如订单的金额为数量与单价的乘积.在应用程序中,若要在显示订单具体条目的同时显示金额,通常要创建一个字段,在显示该字段之前先进行乘法运算,将金 ...

  2. Android Butterknife使用方法总结 IOC框架

    前言: ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神J ...

  3. 【Leetcode_easy】1025. Divisor Game

    problem 1025. Divisor Game 参考 1. Leetcode_easy_1025. Divisor Game; 完

  4. 【Leetcode_easy】897. Increasing Order Search Tree

    problem 897. Increasing Order Search Tree 参考 1. Leetcode_easy_897. Increasing Order Search Tree; 完

  5. Django 之验证和授权

    一.验证和授权概述 Django有一个内置的授权系统.他用来处理用户.分组.权限以及基于cookie的会话系统.Django的授权系统包括验证和授权两个部分.验证是验证这个用户是否是他声称的人(比如用 ...

  6. SpringBoot中使用@Scheduled创建定时任务

    SpringBoot中使用@Scheduled创建定时任务 定时任务一般会在很多项目中都会用到,我们往往会间隔性的的去完成某些特定任务来减少服务器和数据库的压力.比较常见的就是金融服务系统推送回调,一 ...

  7. (二)spring Security 自定义登录页面与校验用户

    文章目录 配置 security 配置下 MVC 自定义登录页面 自定义一个登陆成功欢迎页面 效果图 小结: 使用 Spring Boot 的快速创建项目功能,勾选上本篇博客需要的功能:web,sec ...

  8. golang使用一个二叉树来实现一个插入排序

    思路不太好理解,请用断点 package main import "fmt" type tree struct { value int left, right *tree } fu ...

  9. Python进阶:值传递,引用传递?不存在的,是赋值传递

    Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...

  10. T-SQL学习笔记

    学习T-SQL时记录的笔记,记得并不全也不详细 if和while语句 declare @age int select @age = DATEDIFF(year,stuAge,getdate()) fr ...