二叉树的遍历:前序、中序、后序遍历,递归

image.png

性质:

  • 已知先序和中序,可以确定出二叉树
  • 已知中序和后序,可以确定出二叉树
  • 已知先序和后序,不可以确定出二叉树
  1. // 链式存储结构
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. struct node{
  5. char data;
  6. node *lchild, *rchild;
  7. };
  8. node *root;
  9. // 按先序输入二叉树的结点,输入$表示空树
  10. void build(node* &p){
  11. char c;
  12. scanf("%c", &c);
  13. if (c == '$') p = NULL;
  14. else{
  15. p = new node();
  16. p->data = c;
  17. build(p->lchild); build(p->rchild);
  18. }
  19. }
  20. void pre_order(node *p){
  21. if (p == NULL) return;
  22. if (p->data != '$') cout << p->data;
  23. pre_order(p->lchild);
  24. pre_order(p->rchild);
  25. }
  26. void in_order(node *p){
  27. if (p == NULL) return;
  28. in_order(p->lchild);
  29. if (p->data != '$') cout << p->data;
  30. in_order(p->rchild);
  31. }
  32. void post_order(node *p){
  33. if (p == NULL) return;
  34. post_order(p->lchild);
  35. post_order(p->rchild);
  36. if (p->data != '$') cout << p->data;
  37. }
  38. int main(){
  39. build(root);
  40. pre_order(root);
  41. puts("");
  42. in_order(root);
  43. puts("");
  44. post_order(root);
  45. puts("");
  46. return 0;
  47. }
  48. /*
  49. 输入:AB$$C$$
  50. 输出:
  51. ABC
  52. BAC
  53. BCA
  54. */

例题,【例3-4】求后序遍历

  1. //给出先序和中序,求后续
  2. void dfs(int l1, int r1, int l2, int r2)
  3. //根据先序l1位置的根,去找中序中根的位置

例题,【例3-5】扩展二叉树

  1. //给出扩展二叉树的先序序列,输出中序和后序
  2. //题解给出的是指针写法【指针】

例题,二叉树遍历(flist)

  1. //给出中序序列和按层序列,求先序序列
  2. //在按层遍历序列中先遇到根,在中序序列中,找到根的位置,break出来
  3. //进行递归处理
  4. void dfs(int l1, int r1, int l2, int r2)