标签:title ddr 其它 计算 时间 编号 奇数 12px com
完全二叉树:
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
1 1
/ \ / 2 3 2 3
/ \ / \ / \ 4 5 6 4 5 6
完全二叉树 不完全二叉树
在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]+1是向下取整。满二叉树的深度为d=log2(n+1);
2.1 例题:
有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,
小球每次经过开关就会把它的状态置反,这个开关为关时,小球左跑,为开时右跑。现在问第k个球下落到d层时的开关编号。输入深度d和小球个数k
思路分析:首先该题最先想到的是模拟,开一个数组表示开关,下标表示编号,根据k的子树为2k和2k+1来改变数组,判断进行。但是这样太麻烦了。而且根据深度和小球个数,导致计算量太大。
寻找规律:
#include<stdio.h>
int res_arr[];
void find_addr(int k, int floor)
{
int addr;
addr = 1;
res_arr[0] = addr;
for(i = 1; i < floor; i++)
{
if(k%2)
{
k = (k+1)/2;
addr = 2*addr;
res_arr[i] = addr;
}else
{
k = k/2;
addr = 2*addr + 1;
res_arr[i] = addr;
}
}
}
void main()
{
int i, f, k;
printf("输入小球数及层数:");
scanf('%d%d",&k,&f);
find_addr(k,f);
printf("\n第%d个小球将会经过如下位置\n:",k);
for(i=0; i<f; i++)
{
printf("第%d层,第%d个位置\n", i, res_arr[i]);
}
}
标签:title ddr 其它 计算 时间 编号 奇数 12px com
原文地址:https://www.cnblogs.com/shiqi17/p/9482180.html