从二维数组看二叉树

 每次迭代都会增加一层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;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值