当前位置:   article > 正文

前序、中序、后序遍历的基础详解_前中后序遍历

前中后序遍历

在学习二叉树结构,最简单的方式就是遍历,所谓二叉树遍历是按照某种特定规则,依次对二叉树中的结点进行相应的操作,并且每个结点只操作,。访问结点所做的操作依赖于具体的应用问题。遍历是二叉树最重要的运算之一,也是二叉树上进行其它运算的基础。

按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:
1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。 

如果按照前序,我们怎么遍历上图的结构,其实前序就是先遍历头结点,在遍历左子树最后遍历右子树。所以其顺序是:A   B  D  NULL  NULL  NULL  C  E  NULL  NULL  F NULL  NULL.

中序:先访问左子树再访问头结点最后访问右子树。所以其顺序为:NULL,D,NULL,B,NULL,A,NULL,E,C,NULL,F,NULL.

后序:先访问左子树,再访问右子树,最后访问头结点,所以顺序为:

NULL,NULL,D,NULL,B,NULL,NULL,E,NULL,NULL,F,C,A.

看看程序

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef int BTDataType;
  4. typedef struct BinaryTreeNode
  5. {
  6. BTDataType data;
  7. struct BinaryTreeNode* left;
  8. struct BinaryTreeNode* right;
  9. }BTNode;
  10. BTNode*BuyNode(BTDataType x)
  11. {
  12. BTNode*newnode = (BTNode*)malloc(sizeof(BTNode));
  13. if (newnode == NULL)
  14. {
  15. printf("malloc fail\n");
  16. exit(-1);
  17. }
  18. newnode->data = x;
  19. newnode->left = NULL;
  20. newnode->right = NULL;
  21. return newnode;
  22. }
  23. BTNode* CreatBinaryTree()
  24. {
  25. BTNode* node1 = BuyNode(1);
  26. BTNode* node2 = BuyNode(2);
  27. BTNode* node3 = BuyNode(3);
  28. BTNode* node4 = BuyNode(4);
  29. BTNode* node5 = BuyNode(5);
  30. BTNode* node6 = BuyNode(6);
  31. node1->left = node2;
  32. node1->right = node4;
  33. node2->left = node3;
  34. node4->left = node5;
  35. node4->right = node6;
  36. return node1;
  37. }

这是手动创建一个链表

  1. void PostOrder(BTNode*root)
  2. {
  3. if (root == NULL)
  4. {
  5. printf("NULL ");
  6. return;
  7. }
  8. printf("%d ", root->data);
  9. PostOrder(root->left);
  10. PostOrder(root->right);
  11. }
  12. int main()
  13. {
  14. BTNode*node = CreatBinaryTree();
  15. PostOrder(node);
  16. return 0;
  17. }

运用的递归求解。

 中序:

  1. void PostOrder(BTNode*root)
  2. {
  3. if (root == NULL)
  4. {
  5. printf("NULL ");
  6. return;
  7. }
  8. PostOrder(root->left);
  9. printf("%d ", root->data);
  10. PostOrder(root->right);
  11. }
  12. int main()
  13. {
  14. BTNode*node = CreatBinaryTree();
  15. PostOrder(node);
  16. return 0;
  17. }

后序

  1. void PostOrder(BTNode*root)
  2. {
  3. if (root == NULL)
  4. {
  5. printf("NULL ");
  6. return;
  7. }
  8. PostOrder(root->left);
  9. PostOrder(root->right);
  10. printf("%d ", root->data);
  11. }
  12. int main()
  13. {
  14. BTNode*node = CreatBinaryTree();
  15. PostOrder(node);
  16. return 0;
  17. }

其实,在遍历是同样遍历的,只是打印的时机不同,所以,结果就不同

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/625836
推荐阅读
相关标签
  

闽ICP备14008679号