【问题标题】:Recursion in tree traversal树遍历中的递归
【发布时间】:2017-05-11 03:24:36
【问题描述】:

我是图和树概念的新手。下面是树的中序树遍历。

 if(n!=null){
     treeTraversal(n.left);
     System.out.println(n.val);
     treeTraversal(n.right);
 }

我无法理解流程,因为它涉及递归。有人可以解释一下关于堆栈的控制流是如何发生的吗?

【问题讨论】:

    标签: java recursion data-structures tree


    【解决方案1】:

    假设我有一棵树,它类似于:

        4
       / \
      2   5
     / \
    1   3
    

    您的代码将首先通过左孩子 4 -> 2 -> 1 进行递归。由于 1 没有左孩子(它为空),它将打印 1 然后弹出堆栈。递归的下一个是 2。它将打印 2,然后遍历 2 的右孩子,即 3。它将打印 3,然后弹出堆栈。然后它会打印 4,然后是 4 的右孩子 5。打印的顺序是 1、2、3、4、5。Here 也是一个很好的动画。

    【讨论】:

      【解决方案2】:

      这是一个 inOrder 遍历,如果存在,则首先访问左子节点,如果不存在,则打印点头,然后遍历到左节点 例如,在这棵树中,您的代码输出将是 10, 4, 11, 2, 5, 9, 1, 7, 6, 8, 3 我们也有preOrderpostOrde 遍历

      预购

      preorder(Node N)
      if (N != null)
      Visit N;
      for each child Y of N
      preorder(Y);
      

      并发布订单

      postorder(Node N)
      if (N != null)
      for each child Y of N
      postorder(Y);
      Visit N;
      

      【讨论】:

        【解决方案3】:

        图片用一个简单的树展示了代码的执行,它应该可以帮助你理解递归是如何工作的,只需按照箭头。

        在每个堆栈下都有一个以黄色显示当前节点的树形图(单击图像以展开它):

        【讨论】:

        • 图表是用什么软件做的,图表是自动生成的吗?
        猜你喜欢
        • 2018-07-12
        • 2014-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        相关资源
        最近更新 更多