目录树比较问题 ( 积分: 100 )

  • 主题发起人 主题发起人 boylafong
  • 开始时间 开始时间
B

boylafong

Unregistered / Unconfirmed
GUEST, unregistred user!
我要对2个目录树进行比较
假设
第一个目录的根目录下面有2个节点A和B,A下面有A-1,A-2两个字节点.B无字节点
第二个目录的根目录下面有2个节点A和C,A下面有A-2,A-3两个字节点.C无字节点
我需要的结果是
两个目录树经过比较合成一个目录树,该目录如下:
根目录下面共有3个节点A,B,C,而A节点下面有A-1,A-2,A-3,其他无子节点.
注:两个目录树都是无限制,即每个目录树能无限制增加的字节点.
希望大家给我点思路和方法
 
粗糙写了个,效率好像有点低,有点乱,不过能用

procedure TForm1.Button2Click(Sender: TObject);
begin
addnodes(treeview2.Items,treeview1.Items);
end;

procedure addnodes(DestNodes,SourceNodes:TTreeNodes);
procedure WriteNode(ANode,Parent:TTreeNode;Nodes:TTreeNodes);
var
sNode,Node:TTreeNode;
i:integer;
begin
snode:=nil;
if assigned(parent) then
begin
for i:=0 to parent.Count-1 do
if sametext(parent.Item.Text,anode.Text) then
begin
snode:=parent.Item;
break;
end;
end
else
begin
node:=nodes.GetFirstNode;
while node<>nil do
begin
if sametext(node.Text,anode.Text) then
begin
snode:=node;
break;
end;
node:=node.getNextSibling;
end;
end;
if not assigned(snode) then
snode:=nodes.AddChild(parent,anode.Text);
node:=anode.getFirstChild;
while Node<>nil do
begin
writenode(node,snode,nodes);
Node:=Node.GetNextSibling;
end;
end;
var
node:ttreenode;
begin
node:=SourceNodes.GetFirstNode;
while node<>nil do
begin
writenode(node,nil,DestNodes);
node:=node.getNextSibling;
end;
end;
 
你具体的代码我再看看,我已自己经解决了,因为我的目录信息要保存成文件,可以让其他用户导入跟自己的比较,所以我是保存成结构再生成文件,用的是递归方法:
每个节点记录三个信息,NO(按一定规则生成的唯一号,不会重复), Name(本节点名称), ParentName(父节点名称):
自己写了一个过程,该过程记录三个字段内容,并判断是否有字节点,有的话根据字节点的数目循环调用自己.
 
其实就是树的保存与读取
只不过要注意在某一leave插入节点时,先判断是否有相同节点,也就是你的那个NO,如果有就在原来节点下插入子节点,没有就先创建新节点再插子节点
仅此而已
 
后退
顶部