一棵二叉树,对于任一节点A(数值型),在它下面第二、三层中,如果左子树的节点个数a1与右子树的节点个数a2的比例为1:2或2:1,则A=A+a1+a2。
在它下面的第四至七层中,如果左子树的节点个数a1与右子树的节点个数a2的比例为3:5或5:3,则A=A+a1+a2。提示,不一定是同层的左右子树节点个数之比,也可以是上下层的。且节点在不断地补充增加!每补充增加一个新的节点,都要重新计算A的值(A为任意节点)。其值只算到其下第七层。求一公式,对每补充增加一个新节点以后,可以计算出相关节点的值。

解决方案 »

  1.   

    可以做,但是我不会delphi,
    怎么办?
    考虑纵向优先计算每个节点的值,其中每一步递归都不只保存当前计算到的直,而是用一个数组保存本节点以及其下6层每层节点的合计信息共7个数据
    考虑还不周全,也许5层就够了
    最末层是1,0,0,0,0,0,0
      

  2.   

    第二.三层:比例关系;2:1  第四到七层:比例关系:5:3
    设K为比例因子,D为树的深度。则可以得以下关系:
    A=2K+K  (D<=3)
    A=5K+3K (D<=7)
    由此可断定树的是一个非满二叉树!单节点在左节点上!
    由此可以推出二叉树与深度的关系!由此下手,应该能够找到方法,请继续吧!后面的不写了!
      

  3.   

    /*输入参数是要计算的那个节点的聚丙,但是根据题目,每增加一个节点整个树都需要重新计算,所以每次增加后调用次函数输入参数都应该是根节点的句柄,其中有调用函数求子节点句柄不用我多说了吧?做链表时考虑一下多留两个指针这个函数很好写,自己动动脑筋吧
    我用的只是流程描述,不符合任何语言的语法,所以要向使用这个函数需要根据这个流程用自己的语言重写*/
    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
    }