每次迭代都会增加一层j++;
每层都从i=1开始,
发现·描述二叉树形成过程如注释
#include<stdio.h>
//第一版
//void init(int a[10][20], int i, int j, int n) {
// if (j < 6) {
// a[j][i] = n;
//
// printf("%d %d %d\n", j, i, a[j][i]);
// j++;
// n;
// init(a, 2 * i, j, n);
// init(a, 2 * i - 1, j, n - 1);
// }
//}
//第三版
void init(int a[10][20], int i, int j, int n) {
if (j < 6) {
a[j][i] = n;
printf("%d %d %d\n", j, i, a[j][i]);
j++;
n = n * 2;
init(a, 2 * i-1, j, n);
init(a, 2 * i , j, n + 1);
}
}
//i=1
//2*i-1永远都从1开始,从本层开始
//2*i可以达到2n次方 ,来自最顶层的分支算出来的
//2*j -1+i,i从1开始
//第四版
void show(int a[10][20],int j,int i){
if(j<6){
printf("%d\n",a[j][i]);
j++;
i=i*2;
show(a,j,i-1);
show(a,j,i);
}
}
//为什么i*2-1和i*2就能覆盖全部节点?
//中间34 detal=1;
//相邻的两个数字,差为1,
//然后各自扩增,相差最大为4,
//再其中相邻的,但上一级节点相差为1的
//这一级仍然相差1
//1
//1,2 差1
//1 2 3 4 2,3差1
//1 2 3 4 5 6 7 8
//4,5差1
//第二版
//void init6(int a[10][20], int j, int i, int *p, int n) {
// if (j < 6) {
// a[j][i] = *p;
// printf("%d %d %d %d\n", j, i, a[j][i], n);
// j++;
// (*p) = *p * 2;
// printf("%d\n", *p);
// init6(a, j, 2 * i, p, n);
// init6(a, j, 2 * i - 1, p + 1, n);
// }
//}
int main() {
int a[10][20] = {0};
int i = 0;
int j = 0;
int n = 40;
int p = 1;
init(a, 1, 1, 1);
// init6(a, 1, 1, &p, n);
for (j = 0; j < 10; j++) {
for (i = 0; i < 20; i++) {
printf("%3d ", a[j][i]);
}
printf("\n");
}
show(a,1,1);
return 0;
}