1.一颗高度为h的满k叉树有如下性质:根节点在第1层,第h层上的节点都是叶节点,其余各层上的每个节点都有k棵非空子树。如果按层次顺序从1开始对全部节点编号,问:
(1)各层的节点数目是多少?
(2)编号为p的节点的父节点(若存在)的编号是多少?
(3)编号为p的节点的第i个儿子节点(若存在)的编号是多少?
(4)编号为p的节点有右兄弟的条件是什么?其右兄弟的编号是什么?
答:
(1)kh-1
(2)L(p-2)/k」+1 (p>1)
因为设序号为j的第一个孩子节点为p,则p=(j-1)*k+2,那么反过来,p的父节点j=(p-2)/k+1,因为根节点无双亲,所以j>1
(3)(p-1)*k+i+1
因为p的第一个孩子节点为(p-1)*k+2,那么第i个孩子为(p-1)*k+i-1+2=(p-1)k+i+1
(4)(p-1)%k!=0 , p+1
节点p不是其双亲的第k个子女,才有右兄弟。对一个节点j来说,其第k子女是(j-1)k+k+1=jk+1,所以p不是第k个子女,则p!=jk+1,等价于p-1!=jk ->(p-1)%k!=0
2.已知k阶斐波那契数列的定义为:
f0=0, f1=0, …, fk-2=0,fk-1=1;
fn=fn-1+fn-2+…+fn-k,n=k,k+1,…
(1)试编写求k阶斐波那契数列的第m项值的非递归函数F(k,m)
(2)计算F(5,8)的值。
int F(int k,int m)
{
int f[maxsize],i,j;
for(i=0;i<k-1;i++)
f[i]=0;
f[k-1]=1;
if(m<k)return 0; //前k-1项为0
else if(m==k)return 1; //第k项值为1
else
{
for(i=k;i<m;i++)
{
int sum=0;
for(j=i-k;j<=i-1;j++)
sum=sum+f[j];
f[i]=sum;
}
}
return f[m-1]; //返回第m项值
}
F(5,8)=4
3.假定用两个一维数组L[1:n]和R[1:n]作为有n个节点二叉树的存储结构,L[i]和R[i]分别指示节点i的左儿子和右儿子,0表示空。试写一个算法判断节点u是否为节点v的子孙。
思路:左右子树递归判断。
判断子孙:L[v]==u||R[v]==u
int L[maxsize],R[maxsize];
int Judge(int u,int v)
{
if(v==0) //v为空节点
return 0;
if(L[v]==u||R[v]==u) //u是v的子孙
return 1;
return Judge(u,L[v])||Judge(u,R[v]); //对左右子树递归判定,有一个成功则返回1
}