高性能删除树形结构的空节点(递归遍历树形结构) Delphi

功能:删除树形结构的空节点;

算法:1、先用AllOverTreeView函数递归遍历树形结构,将空节点添加到DelNodeList中;

        2、然后再循环删除DelNodeList的所有节点;

优点:速度很快,只要便利一次树形结构就可以将所有要删除的节点地址保存下来;

 1 procedure TfrmMain.DelHoldNodeWhereNoObject;
 2 var
 3   i: Integer;
 4   TreeNode: TTreeNode;
 5   DelNodeList: TList;
 6   //高性能遍历树形结构
 7   function AllOverTreeView(node:TTreenode):TTreenode;
 8   var
 9     childnode: TTreeNode;
10   begin
11     while node<>nil do
12     begin
13       if node.HasChildren then
14       begin
15         node := node.getFirstChild;
16         AllOverTreeView(node);
17         node := node.Parent;
18       end;
19       
20       if (Node.Data <> nil) and   (PTreeNodeInfo(node.Data)^.Count = 0)
21         and PTreeNodeInfo(node.Data)^.HoldFlag  then
22       begin
23         DelNodeList.Add(node);
24       end;
25 
26       if node.getNextSibling <> nil then
27         node := node.getNextSibling
28       else
29         Exit;
30     end;
31   end;
32 begin
33   DelNodeList := TList.Create;
34   try
35     TreeNode:=FObjTreeView.Items.GetFirstNode;
36     AllOverTreeView(TreeNode);
37     if DelNodeList.Count > 0 then
38     begin
39       for i := DelNodeList.Count -1 downto 0 do
40       begin
41         TTreeNode(DelNodeList.Items[i]).Delete;
42       end;
43     end;
44   finally
45     DelNodeList.Free;
46   end;
47 end;
48 
49 if node.getNextSibling <> nil then
50 node := node.getNextSibling
51 else
52 Exit;
53 end;
54 end;

当要删除的节点很多时(几百上千),利用树形结构本身的delete函数删除节点的话效率很慢,耗时很长。原因是每次执行

Items.Delete(TreeNode);时都要遍历一次树形结构找到该节点的地址。当要删除的节点太多时就会严重影响性能。

下面是代码

procedure TfrmMain.DelHoldNodeWhereNoObject;
var
  i: Integer;
  TreeNode: TTreeNode;
begin
  with  FObjTreeView do
  begin
    Canvas.Lock;
    for i := Items.Count - 1 downto 0 do
    begin
      TreeNode := Items[i];
      if not TreeNode.HasChildren then
      begin
        if (TreeNode.Data <> nil) then
        begin
          if PTreeNodeInfo(TreeNode.Data)^.HoldFlag then
          begin
            Items.Delete(TreeNode);
          end;
        end;
      end;
    end;
    Canvas.Unlock;
  end;
end;

(此处代码说明,

FObjTreeView :TtreeView;
PTreeNodeInfo是属性节点保存的数据结构;)

转载于:https://www.cnblogs.com/delphi323/archive/2012/07/21/2602212.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值