如何按层遍历treeview的每个节点?(完全的广度优先实现)(100分)

  • 主题发起人 主题发起人 vinger
  • 开始时间 开始时间
V

vinger

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个问题,想按层遍历treeview的每个节点,但经过多次努力都无法实现。我曾按如下代码通过递归进行,但除了第一层正确外,下面基本上是对每个子树进行深度优先搜索后再进行另外一个子树的深度优先搜索。代码如下:
procedure search(N: TTreeNode);
begin
if N <> nil then
begin
listbox1.items.add(n.text);
search(N.GetNextSibling);
search(N.GetFirstChild);
end;
end;

该段代码能完全列出所有节点,但不能按层列,那位朋友能帮我解决这个问题?谢谢!
 
我已实现如下:
采用数组:
procedure TForm1.Button1Click(Sender: TObject);
var
a:array of Ttreenode;
node:TTreenode;
i,j,count:integer;
begin
i:=0;j:=0;
Count:=Treeview1.Items.Count;
setlength(a,Count);
node:=Treeview1.TopItem;
while node<>nil do
begin
a:=node;
node:=node.getNextSibling;
i:=i+1;
end;
j:=i-1;
i:=0;
while i<Count do
begin
node:=a.getfirstchild;
while node <> nil do
begin
j:=j+1;
a[j]:=node;
node:=node.getNextSibling;
end;
i:=i+1;
end;
//以下用于集中输出,当然也可以在中间输出
for i:=0 to Count-1 do
listbox1.Items.Add(a.text);
end;
本人已经过调试,应能完成您上述需求;
哈哈,快给我分。
 
感谢SEA713提供的思路,但所列程序明显有错,好象缺东西,还请SEA713提供完全代
码。本人在可能有错的地方已经标注为?????了
procedure TForm1.Button1Click(Sender: TObject);
var
a:array of Ttreenode;
node:TTreenode;
i,j,count:integer;
begin
i:=0;j:=0;
Count:=Treeview1.Items.Count;
setlength(a,Count);
node:=Treeview1.TopItem;
while node<>nil do
begin
a:=node;
node:=node.getNextSibling;
i:=i+1;
end;
j:=i-1;
i:=0;
while i nil do //?????这里是不是缺东西了?
begin
j:=j+1;
a[j]:=node;
node:=node.getNextSibling;
end;
i:=i+1; //?????这一句是干什蚂的
end;
//以下用于集中输出,当然也可以在中间输出
for i:=0 to Count-1 do
listbox1.Items.Add(a.text);
end;
 
非常感谢sea713先生,我心甘情愿地奉上100分,感谢你的负责和高超的技术,希望以后能多和你学习。
 
后退
顶部