树遍历以级别优先顺序和深度优先顺序递归

时间:2009-10-15 02:13:40

标签: algorithm tree traversal

是否有任何算法可以在级别优先顺序中递归遍历树,并且在后序中非递归地遍历。谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用堆栈而不是递归中使用的隐式调用堆栈,以迭代方式递归递归树。

答案 1 :(得分:1)

要获得有效的递归广度优先搜索,您可以使用iterative deepening depth-first search。这对于分支因子很高的情况尤其有用,常规的广度优先搜索往往会因过多的内存消耗而窒息。

修改 Marcos Marin already mentioned it,但为了完整起见,the Wikipedia page on breadth-first traversal描述了算法:

  
      
  1. 将根节点排队。
  2.   
  3. 将节点出列并进行检查。      
        
    • 如果在此节点中找到所寻找的元素,请退出搜索并返回结果。
    •   
    • 否则将任何尚未发现的后继者(直接子节点)排队。
    •   
  4.   
  5. 如果队列为空,则检查图表上的每个节点 - 退出搜索并返回“未找到”。
  6.   
  7. 从第2步开始重复。
  8.         

    注意:使用堆栈而不是队列会将此算法转变为深度优先搜索。

如果你想进行非递归深度优先遍历,那么最后一行显然对你很有意思。获取预订或订购后只需修改步骤2.b中添加节点的方式。

答案 2 :(得分:0)

Wikipedia说,

  

<强>穿越

     

与线性数据结构相比   像链表和一维   数组,只有一个逻辑   遍历方式,树结构   可以遍历许多不同的   方法。从二进制文件的根开始   树,有三个主要步骤   可以执行和订单   它们的执行定义了   遍历类型。

     

这些步骤(没有   特别的顺序)是:表演   对当前节点的操作(参考   作为“访问”节点),遍历   到左子节点,并遍历   到正确的子节点。就这样   过程最容易描述   通过递归。

     

遍历非空二进制树   预订,执行以下操作   在每个节点递归操作,   从根节点开始:

     
      
  1. 访问节点。
  2.   
  3. 遍历左子树。
  4.   
  5. 遍历正确的子树。 (这也称为 Depth-first traversal.
  6.         

    遍历非空二进制树   按顺序执行以下操作   在每个节点递归操作:

         
        
    1. 遍历左子树。
    2.   
    3. 访问节点。
    4.   
    5. 遍历正确的子树。 (这也称为对称遍历。)
    6.         

      遍历非空二进制树   后序,执行以下操作   在每个节点递归操作:

           
          
      1. 遍历左子树。
      2.   
      3. 遍历正确的子树。
      4.   
      5. 访问节点。
      6.         

        最后,树也可以遍历   在级别订单,我们访问每一个   在转到a之前的某个级别上的节点   低等级。这也叫做   的 Breadth-first traversal