fork download
  1. #include <stdio.h>
  2.  
  3. #define height 4 //木の高さ (今回は4)
  4. #define MAX (1<<height) //木の最大の大きさ
  5. //ビットシフト演算 2^height と同じ
  6. int sz = 0; //木の要素数
  7. int t[MAX+1]; //二分木の配列 +1はダミー
  8.  
  9.  
  10. // 演習2
  11. int goP(int i); // 親のノードの添え字を求める関数
  12. int goL(int i); // 左の子のノードの添え字を求める関数
  13. int goR(int i); // 右の子のノードの添え字を求める関数
  14. void printA(); // 配列を出力する関数
  15.  
  16. int goP(int i){
  17. if(i/2 == 0) return 0;
  18. else return i/2;
  19. }
  20.  
  21. int goL(int i){
  22. if(2*i >= MAX) return 0;
  23. else return 2*i;
  24. }
  25.  
  26. int goR(int i){
  27. if(2*i+1 >= MAX) return 0;
  28. else return 2*i+1;
  29. }
  30.  
  31. void printA(){
  32. int i;
  33. for(i=1;i<=MAX;i++)
  34. printf("%d ",t[i]);
  35. printf("\n");
  36. }
  37.  
  38.  
  39.  
  40. int main(void) {
  41. int i,n;
  42. scanf("%d",&n);
  43.  
  44. // ここではシンプルに演習2だけのためにP.29の配列 t をそのまま読み込んでいる
  45. for(i=0;i<n;i++){
  46. scanf("%d",&(t[i]));
  47. }
  48. // ちゃんと読み込めたかの確認
  49. for(i=0;i<n;i++){
  50. printf("t[%d]=%d\n", i, t[i]);
  51. }
  52.  
  53. // goP, goL, goR が正しく実装できているか
  54. // 自分でコードを追加して確認してください。
  55. int j = goP(5);
  56.  
  57. printf("ノード %d(値は %d) の親は ノード%d で値は %d\n", 5, t[5], j, t[j]);
  58.  
  59.  
  60. return 0;
  61.  
  62. }
  63.  
Success #stdin #stdout 0s 5272KB
stdin
16
-1 13 3 21 2 5 -1 -1 -1 -1 -1 8 -1 -1 -1 -1
stdout
t[0]=-1
t[1]=13
t[2]=3
t[3]=21
t[4]=2
t[5]=5
t[6]=-1
t[7]=-1
t[8]=-1
t[9]=-1
t[10]=-1
t[11]=8
t[12]=-1
t[13]=-1
t[14]=-1
t[15]=-1
ノード 5(値は 5) の親は ノード2 で値は 3