史上最全的树的遍历总结

树是一种非常重要的数据结构,树的遍历又是树中一个知识点,所以今天打算将树的遍历以及算法做一个全面的总结。

树的遍历的种类

  1. 前序遍历
  2. 中序遍历
  3. 后序遍历
  4. 广度优先遍历(BFS,层次遍历)
  5. 深度优先遍历(DFS)

不懂树的遍历操作具体是怎样的可以看我的另一篇博文:树的遍历操作详解

算法实现

只是粗略讲解,具体实请看文章树的遍历算法实现–C++

  1. 对于前序,中序,后序遍历:
    1. 递归的方法实现
    2. 非递归方法(手动使用栈来保存当前节点信息)
    3. Morris遍历算法
  2. 对于深度优先遍历,广度优先遍历:
    1. 广度优先遍历:由于队列具有先进先出的特征,使用队列来实现BFS
    2. 深度优先遍历:由于栈具有后进先出的特点,可以先将右节点压栈,再将左节点压栈。

算法复杂度分析

  1. 非递归:因为使用到了栈来保存节点信息,所以额外消耗了内存,每个节点都要进栈出栈,所以空间复杂度为O(N),因为每个节点都要遍历一遍,所以时间复杂度为O(N)
  2. 递归:递归的本质就是用压栈与出栈操作,每当递归调用函数就压栈,直到递归到遇到结束条件就出栈。只是没有显示的调用栈,由计算机为我们隐式完成,所以时间复杂度和空间复杂度都是O(N)
  3. Morris遍历:Morris遍历最大程度的利用了树的空间,由于树的叶子节点的左右节点都为空,所以Morris遍历的方法就是利用这些闲置的指针来完成遍历,所以不需要额外的内存开销,空间复杂度为O(1),但是Morris遍历也需要遍历每一个节点,时间复杂度为O(N)
  4. 广度优先遍历:使用了队列,增加了额外空间开销,遍历过程中每一层的节点都要进队列出队列,所以空间复杂度和时间复杂度都是O(N)
  5. 深度优先遍历:使用了栈,增加了额外空间开销,遍历过程中每一个节点都需要进行进栈和出栈操作,所以空间复杂度和时间复杂度都是O(N)
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页