完全二叉树的定义与基本性质

image.png

完全二叉树的数组表示法

  • 对于一棵具有 n 个结点的完全二叉树,对于任意一个结点,编号为 i

if (i > 1) 父结点编号 i / 2
if (2 i > n) 没有左儿子 else 左儿子编号为 2 i
if (2 i + 1 > n) 没有右儿子 else 右儿子编号为 2 i + 1
image.png

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1010;
  4. char data[N];
  5. int node[N];
  6. int n;
  7. void pre_order(int i){
  8. if (data[i] == '$') return ;
  9. if (data[i] != '$') cout << data[i];
  10. if (i * 2 <= n) pre_order(i * 2);
  11. if (i * 2 + 1 <= n) pre_order(i * 2 + 1);
  12. }
  13. void in_order(int i){
  14. if (data[i] == '$') return ;
  15. if (i * 2 <= n) in_order(i * 2);
  16. if (data[i] != 'S') cout << data[i];
  17. if (i * 2 + 1 <= n) in_order(i * 2 + 1);
  18. }
  19. void post_order(int i){
  20. if (data[i] == '$') return ;
  21. if (i * 2 <= n) post_order(i * 2);
  22. if (i * 2 + 1 <= n) post_order(i * 2 + 1);
  23. if (data[i] != 'S') cout << data[i];
  24. }
  25. int main(){
  26. memset(data, '$', sizeof data);
  27. cin >> n; // 结点总数
  28. for (int i = 1; i <= n; i++) cin >> data[i]; // 根结点下标是1,从上到下,从左到右输入
  29. pre_order(1);
  30. puts("");
  31. in_order(1);
  32. puts("");
  33. post_order(1);
  34. puts("");
  35. return 0;
  36. }
  37. /*
  38. 输入:
  39. 3
  40. A B C
  41. 输出:
  42. ABC
  43. BAC
  44. BCA
  45. */