二叉树双阶遍历

时间:2011-08-04 02:05:39

标签: c binary-tree

任何人都可以向我解释双顺序遍历吗?

        A
      /   \
     B     E
   /  \   /  \
  C   D  F    G

双顺序遍历输出:ABCCBDDAEFFEGG

我对解释而不是代码感兴趣。

谢谢

4 个答案:

答案 0 :(得分:5)

假设您对双顺序遍历的解释感兴趣:

对于每次遍历,你

  • 访问节点
  • Traverse Left Child
  • 访问节点
  • Traverse Right Child

这就是它的全部。如果您没有左子女(例如C),则两个“访问节点”操作会背靠背发生,这就是您在输出中看到两个C的原因。

只是为了将其可视化(输出以粗体显示):

  • 访问A: A
  • Traverse left child B
    • 访问B: AB
    • Traverse left child C
      • 访问C: ABC
      • 没有留下的孩子
      • 访问C: ABCC
      • 没有合适的孩子
    • Traverse right child D
      • 访问D: ABCCD
      • 没有留下的孩子
      • 访问D: ABCCDD
      • 没有合适的孩子
  • 访问A: ABCCDDA
  • Traverse right child E
    • 访问E: ABCCDDAE

答案 1 :(得分:0)

想象一下,你正在走路,从根开始。

  1. 你在A;
  2. 走向左边的孩子,你到了B;
  3. 走向左边的孩子,C;
  4. 死路一条,你回头,还是C;
  5. 回到B;
  6. 走到右边的孩子,到D;
  7. 死胡同,回头还是D;
  8. 这只是一种遍历内外的遍历。

    在前序遍历中左右儿童的访问之间,你访问根(因为你必须回到它进一步走),你可以认为叶子是没有孩子的根,{{1}只会让你立刻回去(因此连续两次访问叶子,节点只有正确的孩子)。

答案 2 :(得分:0)

递归:

1. Visit root of (sub)tree.
2. Visit left subtree.
3. Revisit root of (sub)tree.
4. Visit right subtree.

Offhand我想不出它的应用程序,虽然我已经做了一些真正奇特的事情,一堆树上的节点(和链接列表)同时出现。

答案 3 :(得分:0)

主要是遍历树的递归方法(这里我们要处理二叉树)

这是用于双顺序遍历的算法:

DoubleDouble算法(根)

  1. 如果(root不为NULL)

    1. 打印(根)
    2. DoubleOrder (左子树)//递归调用
    3. 打印(根)
    4. DoubleOrder (rightSubtree)//递归调用
  2. endif

  3. 结束 DoubleOrder

说明:

  1. 访问A并打印输出:A
  2. 有左子树
    1. 访问B并打印输出:AB
    2. B已离开子树
      1. 访问C并打印输出:ABC
      2. C没有左子树
      3. 再次访问C并将其打印输出:ABCC
      4. C没有子树
      5. 返回到B(对于C,所有4条语句均已执行)
    3. 再次访问B并将其打印输出:ABCCB
    4. B具有正确的子树
      1. 访问D并将其打印输出:ABCCBD
      2. D没有左子树
      3. 再次访问D并将其打印输出:ABCCBDD
      4. D没有子树
      5. 返回到B(对于D,所有4条语句都已执行)
    5. 返回A(对于B,所有4条语句均已执行)
  3. 再次访问A并将其打印输出:ABCCBDDA
  4. 有正确的子树
    1. 访问E并打印输出:ABCCBDDAE
    2. E已离开子树
      1. 访问F并将其打印输出:ABCCBDDAEF
      2. F没有左子树
      3. 再次访问F并将其打印输出:ABCCBDDAEFF
      4. F没有子树
      5. 返回E(对于F,所有4条语句均已执行)
    3. 再次访问E并打印输出:ABCCBDDAEFFE
    4. E具有正确的子树
      1. 访问G并打印输出:ABCCBDDAEFFEG
      2. G没有左子树
      3. 再次访问G并将其打印输出:ABCCBDDAEFFEGG
      4. G没有子树
      5. 返回E(对于G,所有4条语句均已执行)
    5. 返回A(在E的情况下,所有4条语句均已执行)
  5. 当我们返回树的主根时停止执行(因为所有4条语句均已执行 如果是A)

最终输出:ABCCBDDAEFFEGG

我希望它可以帮助您理解整体概念!我很高兴第一次回答堆栈溢出问题:)