树的遍历

  • 树的先序遍历:先访问树的根结点,然后自左向右先序遍历根的每一颗子树,这个访问顺序与这棵树对应的二叉树的先序遍历顺序相同
  • 树的后序遍历:先自左向右依次遍历每棵子树,再访问根结点,其访问顺序与这棵树对应的二叉树的中序遍历顺序相同
  • 树的中序遍历:因为树的子树数目不确定,所以一般不考虑树的中序遍历

image.png
根据这幅图而言:
树的先序遍历:A-B-E-F-G-C-H-D-I-J(与二叉树的先序遍历相一致)
对应的二叉树的先序遍历:A-B-E-F-G-C-H-D-I-J(与树的先序遍历相一致)

树的后序遍历:E-F-G-B-H-C-I-J-D-A(与二叉树的中序遍历相一致)
对应的二叉树的后序遍历:G-F-E-H-J-I-D-C-B-A
对应的二叉树的中序遍历:E-F-G-B-H-C-I-J-D-A(与树的后序遍历相一致)

森林的遍历

image.png
森林的先序遍历:A-B-C-D-E-F-G-H-J-I
二叉树森林的先序遍历:A-B-C-D-E-F-G-H-J-I(相同)
完整二叉树的先序遍历:A-B-C-D-E-F-G-H-J-I (相同)

森林的后序遍历:B-C-D-A-F-E-J-H-I-G
二叉树森林的后序遍历:D-C-B-A-F-E-J-I-H-G
完整二叉树的后序遍历:D-C-B-F-J-I-H-G-E-A(不同于二叉树森林的后序遍历)

二叉树森林的中序遍历:B-C-D-A-F-E-J-H-I-G(与森林的后根遍历相同)
完整二叉树的中序遍历:B-C-D-A-F-E-J-H-I-G(与森林的后根遍历相同,自然也与二叉树森林的中序遍历相同)

注意: 只有二叉树森林才有中序遍历,非二叉树森林是没有中序遍历的,因为普通树一般不考虑中序遍历

先序遍历的算法实现:

  1. Status PreOrderTraverseForest(CSForest F,Status(*visit)(TELemType)){
  2. //森林为空
  3. if(F==NULL) return ERROR;
  4. //访问第一棵树的根结点
  5. if(visit(F->data)==ERROR) return ERROR;
  6. //递归先序遍历第一棵树的子树森林
  7. if(PreOrderTraverseForest(F->firstChild,visit)== ERROR) return ERROR;
  8. //递归先序遍历剩余森林
  9. return PreOrderTraverseForest(F->nextSibling,visit);
  10. }