数据库结构如下:
id parentid,name,money,totalmoney,submoney
0,0,根节点,0,15000,0
1,0,张山,1000,5000,0
2,0,张好,2000,7000,0
3,0,王五,3000,3000,0
4,1,黎明,4000,4000,0
5,2,老刘,5000,5000,0
通过数据库加载到tree
现在想反向计算submoney.
submoney 是当前节点的totalmoney 减去下面所有层次的money.
并且要去掉当前下级节点的money最大值。type
 tmydata = record
 id:integer;
 parentid:integer;
 name:string;
 money:double;
 totalmoney:double;
 submoney:double;
 resume:boolean;
 end;
pmydata = ^tmydata;function submoney(p:tTreenode):double;
var
i:integer;
d:pcustdata;
begin
  d:=pcustdata(p.data);
  if p.Count <1 then
  begin
  d.submoney := 0; //=0
  result := d.money;
  d.resum:=false;
  exit;
  end;
  result := d.money;
  for i:=0 to p.count -1 do
  result := result + submoney(p.Item[i]);
//全部加起来以后用总数去减
  d.submoney := d.totalmoney + d.money - result;
  d.resum:=false;
end;
//我写的这个没有考虑下级节点的最大值。
//另外一种。
function submoney(p:tTreenode):double;
var
i:integer;
d:pcustdata;
begin
  d:=pcustdata(p.data);
  if p.Count <1 then
  begin
  d.submoney := 0; //=0
  result := d.money;
  d.resum:=false;
  exit;
  end;
  result := d.submoney;
  for i:=0 to p.count -1 do
  result := result - submoney(p.Item[i]);//这样减好像只是得到了一层节点的数据,并且减去的数是已经减了之后的数
  d.submoney := result;
  d.resum:=false;
end;我这两种写法都好像有错,请大伙帮忙看看

解决方案 »

  1.   

    submoney 是当前节点的totalmoney(是它吗?) 减去下面所有层次的money.——那不就是自身的money了?
    并且要去掉当前下级节点的money最大值(直接子节点的最大者,还是所有子节点里的最大者)。
      

  2.   

    就等你了。
    现在的totalmoney都算出来了。
    submoney初始化的时候是0。
    要求submoney=自己的totalmoney - 下面所有层次节点的money,
    直接下层节点要求去掉最大的money的那一个,再以后的层次节点不去掉最大值
      

  3.   

    还有最后一层的节点的submoney始终是0
      

  4.   

    如果某个节点只有一个子节点的时候submoney也要=0
      

  5.   

    这个业务逻辑有点绕,
    如果树不大,干脆每次都重新算好了
    或者:
    function maxsub(p:Ttreenode);
    var
      i:integer;
    begin
      result:=0;
      for i:=0 to p.count-1 do
        if result < Pnodedata(p.item[i].data).money then
          result := Pnodedata(p.item[i].data).money;
    end;
    with nodedata do
    begin
      submoney:=money*2-totalmoney-maxsub(p);  
    end;
      

  6.   

    你这个写法,没有看太懂。
    要不这样。
    nodedata= record
    id:integer;
    parentid:integer;
    name:string;
    money:double;
    totalmoney:double;
    submoney:double;
    ismax:boolean;
    end;
    我这里加入了一个ismax表示这个节点的最大值状态,这个ismax我最开始就已经算出来。
    我刚才的逻辑描述还有点问题。
    要求submoney=totalmoney-下面所有节点的money
    但是要求去掉max节点和max节点的所有分支。(也就是最大节点的那个分支的所有节点都忽略不要减了)
      

  7.   

    这个最大节点要求是totalmoney的最大节点,不是money的最大节点
      

  8.   


    function submoney(p:tTreenode):double;
    var
    i:integer;
    d:pcustdata;
    begin
      d:=pcustdata(p.data);
      if p.Count <1 then
      begin
      d.submoney := 0; //=0
      result := d.money;
      exit;
      end;
      result := d.money;
      for i:=0 to p.count -1 do
    begin  
    if pcustdata(p.item[i]).ismax=false then
    result := result + submoney(p.Item[i]);
    end;
      d.submoney := d.totalmoney + d.money - result;
      d.resum:=false;
    end;