18 计学

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
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值