二叉树

二叉树的遍历

  • 前序:根节点->左子树->右子树
  • 中序:左子树->根节点->右子树
  • 后序:左子树->右子树->根节点
  • 层序:每一层从左到右输出

备注:前中后是以根节点的位置来说的。

实例

  1. 根据前序、中序遍历,输出后序遍历
class BackOrder {
    var res: [Int] = []
    var pre: [Int] = []
    var inorder: [Int] = []

    /// 根据前序、中序遍历输出二叉树的后序遍历
    func buildBackOrder(pre: [Int], inorder: [Int]) -> [Int] {
        self.pre = pre
        self.inorder = inorder
        getNode(root: 0, start: 0, end: inorder.count - 1)
        return res
    }

    /// - Parameter root: 前序遍历根结点位置
    /// - Parameter start: 中序遍历子树起始位置
    /// - Parameter end: 中序遍历子树结束位置
    func getNode(root: Int, start: Int, end: Int) {
        guard start <= end else { return }

        var left = start
        // 定位跟在中序遍历中的位置
        while left <= end && inorder[left] != pre[root]  {
            left += 1
        }

        // 递归处理左子树
        getNode(root: root + 1, start: start, end: left - 1)
        // 递归处理右子树
        // 需要找到前序遍历中右子树的起始位置,left - right 表示左子树的数量, + 1 为根结点
        getNode(root: root + left - start + 1, start: left + 1, end: end)

        res.append(pre[root])
    }
}

参考

程序基本功之遍历二叉树

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,489评论 1 31
  • 一直以来,我都很少使用也避免使用到树和图,总觉得它们神秘而又复杂,但是树在一些运算和查找中也不可避免的要使用到,那...
    24K男阅读 6,782评论 5 14
  • 这几天开学,学校还在上课,最近也是在找工作,很多天都没有更新文章,现在补一篇二叉树的文章。 最近校招公司的笔试陆续...
    zero_sr阅读 3,992评论 0 5
  • 编程中我们会遇到多少挫折?表放弃,沙漠尽头必是绿洲。 学习二叉树的意义 由于二叉树的知识更倾向于理论,所以我们在实...
    神经骚栋阅读 6,310评论 5 57
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,531评论 0 14