一棵二叉树,对于任一节点A(数值型),在它下面第二、三层中,如果左子树的节点个数a1与右子树的节点个数a2的比例为1:2或2:1,则A=A+a1+a2。
在它下面的第四至七层中,如果左子树的节点个数a1与右子树的节点个数a2的比例为3:5或5:3,则A=A+a1+a2。提示,不一定是同层的左右子树节点个数之比,也可以是上下层的。且节点在不断地补充增加!每补充增加一个新的节点,都要重新计算A的值(A为任意节点)。其值只算到其下第七层。求一公式,对每补充增加一个新节点以后,可以计算出相关节点的值。
在它下面的第四至七层中,如果左子树的节点个数a1与右子树的节点个数a2的比例为3:5或5:3,则A=A+a1+a2。提示,不一定是同层的左右子树节点个数之比,也可以是上下层的。且节点在不断地补充增加!每补充增加一个新的节点,都要重新计算A的值(A为任意节点)。其值只算到其下第七层。求一公式,对每补充增加一个新节点以后,可以计算出相关节点的值。
怎么办?
考虑纵向优先计算每个节点的值,其中每一步递归都不只保存当前计算到的直,而是用一个数组保存本节点以及其下6层每层节点的合计信息共7个数据
考虑还不周全,也许5层就够了
最末层是1,0,0,0,0,0,0
设K为比例因子,D为树的深度。则可以得以下关系:
A=2K+K (D<=3)
A=5K+3K (D<=7)
由此可断定树的是一个非满二叉树!单节点在左节点上!
由此可以推出二叉树与深度的关系!由此下手,应该能够找到方法,请继续吧!后面的不写了!
我用的只是流程描述,不符合任何语言的语法,所以要向使用这个函数需要根据这个流程用自己的语言重写*/
f(long handle)
{
int li_rtn[7]//记录各级子节点总数
int li_childleft[7],li_childright[7]
int lefthandle,righthandle
lefthandle=getleft(handle)//取左子节点句柄,没有返回0,有就返回句柄
righthandle=getrignt(handle)//取右子节点句柄,没有返回0,有就返回句柄
if lefthandle=0 then//没有子节点
li_childleft[1]=0
li_childleft[2]=0
li_childleft[3]=0
li_childleft[4]=0
li_childleft[5]=0
li_childleft[6]=0
li_childleft[7]=0
li_childright[1]=0
li_childright[2]=0
li_childright[3]=0
li_childright[4]=0
li_childright[5]=0
li_childright[6]=0
li_childright[7]=0
else
li_childleft=f(lefthandle)
//有左节点时判断右节点
if righthandle=0 then
li_childright[1]=0
li_childright[2]=0
li_childright[3]=0
li_childright[4]=0
li_childright[5]=0
li_childright[6]=0
li_childright[7]=0
else
li_childright=f(righthandle)
end if
end if
li_rtn[1]=li_childleft[1]+li_childright[1]+1//本枝节点数等于左右子节点合计加上本身1个
for i=1 to 6
li_rtn[i+1]=li_childleft[i]+li_childright[i]
next//设置数值
//2到3层,就是子节点的1、2层
a1=li_childleft[1] -li_childleft[3]
a2=li_childright[1] -li_childright[3]
if (a1*2=a2 or a1=a2*2) and a1<>0 then
A=A+a1+a2
else
//4到7层就是子节点的3-6层
a1=li_childleft[3] -li_childleft[7]
a2=li_childright[3] -li_childright[7]
if (a1*3=a2*5 or a1*5=a2*3) and a1<>0 then
A=A+a1+a2
end if
end if
}