1.二叉树的常用性质
<1>.在二叉树的第i层上最多有2 i-1 个节点 。(i>=1)
<2>.二叉树中如果深度为k(有k层),那么最多有2k-1个节点。(k>=1)
<3>.若二叉树按照从上到下从左到右依次编号,则若某节点编号为k,则其左右子树根节点编号分别为2k和2k+1;
<4>.二叉树分类:满二叉树,完全二叉树
满二叉树:高度为h,由2^h-1个节点构成的二叉树称为满二叉树。
<5>.在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]+1是向下取整。满二叉树的深度为k=log2(n+1);
2.二叉树的循环递归规律法
例题:uva679小球下落
题意:有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,
小球每次经过开关就会把它的状态置反,这个开关为关时,小球左跑,为开时右跑。现在问第k个球下落到d层时的开关编号。输入深度d和小球个数k。d<20,k<524288
<1>.首先对于每一层,第奇数个落入该层的球都是往左走的,第偶数个落入该层的球都是往右走的。
<2>.因为小球都是按照编号依次下落的,对于左枝(也就是奇数球),每个I号小球落入该层都是第(I+1)/2个小球。而偶数是往右走的I/2个小球!
<3>.因此每一层循环递归,来判断i,循环d层,即可找出最后叶子!省去大数组和大时间
代码:
#include
#include
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n==-1)break;
int D,I;
while(n–)
{
cin>>D>>I;//D层I个小球
int k=1;
for(int i=0; i<D-1; i++)
{
if(I%2)//奇数是往左走的第(i+1)/2个小球
{
k=k2;//往左走是k2