数据库结构如下:
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,0type
 tmydata = record
 id:integer;
 parentid:integer;
 name:string;
 money:double;
 totalmoney:double;
 submoney:double;
 resume:boolean;
 end;
pmydata = ^tmydata;现在想反向计算submoney.
submoney 是当前节点的totalmoney 减去下面所有层次的money.
并且要去掉当前下级节点的money最大值。
function submoney(p:tTreenode):double;
var
i:integer;
d:pcustdata;
begin
  d:=pcustdata(p.data);
  {
  if not d.resum then //resum 起到只计算一次的作用?。
  begin
  result:=d.money;
  exit;
  end;
  }
  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 not d.resum then //resum 起到只计算一次的作用?。
  begin
  result:=d.submoney;
  exit;
  end;
  }
  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.   


    type
     tmydata = record
     id:integer;
     parentid:integer;
     name:string;
     money:double;
     totalmoney:double;
     submoney:double;
     resume:boolean;
     end;
    pmydata = ^tmydata;现在想反向计算submoney.
    submoney 是当前节点的totalmoney 减去下面所有层次的money.
    并且要去掉当前下级节点的money最大值。
    function submoney(p:tTreenode):double;
    var
    i:integer;
    d:pcustdata;
    begin
      d:=pcustdata(p.data);
      {
      if not d.resum then //resum 起到只计算一次的作用?。
      begin
      result:=d.money;
      exit;
      end;
      }
      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 not d.resum then //resum 起到只计算一次的作用?。
      begin
      result:=d.submoney;
      exit;
      end;
      }
      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;
    帮忙看看
      

  2.   


    //结构体加上一个子节点的地址就很容易操作了。
    type
     tmydata = record
     id:integer;
     parentid:integer;
     name:string;
     money:double;
     totalmoney:double;
     submoney:double;
     resume:boolean;
     items:TMyDataArr;
     end;
    TMyDataArr = array of tmydata;//这里也做了下修改。
    不知道能不能行,作为一种参考吧。
      

  3.   

    我需要的是递归的算法。
    上面我写的有错误。
    这个数据已经从数据库加载到treeview了。
      

  4.   

    submoney = 2*totalmoney - submoney(p.item[i])