请教一个算法问题:关于treeview节点选中的判断(100分)

  • 主题发起人 主题发起人 哦哦哦哦哦
  • 开始时间 开始时间

哦哦哦哦哦

Unregistered / Unconfirmed
GUEST, unregistred user!
一个treeview显示树形结构,这棵树比较大,层次在4-10层不定,当在treeview上选中大量节点后,需要进行如下判断:
遍历最底层节点,如果选中则找和它同一个父节点的所有同级节点,如果所有同级节点被选中,则它的父节点就是要找的。
现在如何找到所有这样的父节点?
 
听起来有点晕,我有个遍历一棵树全部接点的函数要不要?
 
遍历一棵树全部节点?这个很简单啊,循环就行了。
我的意思就是找出最底层得上一层中,所有子节点都被选中的节点
 
不递归用循环是很难遍历的。不大明白你的意思
 
呵呵,不管用什么,能解决问题就行
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
PNode = ^TNode;
TNode = record
Node: TTreeNode;
Next: PNode;
end;

type
TForm1 = class(TForm)
tvTree: TTreeView;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
HeadNode,TailNode: PNode;
function GetNode(cNode: TTreeNode): TTreeNode;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
sNode: TTreeNode;
cNode: PNode;
begin
for i := 0 to tvTree.Items.Count - 1do
begin
if tvTree.Items.Item.Selected then
begin
sNode := GetNode(tvTree.Items.Item);
if HeadNode = nil then
begin
New(HeadNode);
HeadNode^.Node := sNode;
HeadNode^.Next := nil;
TailNode := HeadNode;
end
else
begin
New(cNode);
cNode^.Node := sNode;
cNode^.Next := nil;
TailNode := cNode;
end;
end;
end;
end;

function TForm1.GetNode(cNode: TTreeNode): TTreeNode;
var
sNode, iNode: TTreeNode;
begin
Result := nil;
if cNode.Parent = nil then
exit;
if cNode.getFirstChild <> nil then
exit;
sNode := cNode.Parent;
iNode := sNode.getFirstChild;
while iNode <> nildo
begin
if not iNode.Selected then
exit;
iNode := sNode.GetNextChild(iNode);
end;
Result := iNode;
end;

end.
最后形成的链表就是满足条件的接点结合
 
简单问题复杂化了
 
楼上的话别说一半,有啥好办法说来听听
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function findnode: Ttreenode;
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:= findnode.Text;
end;

function TForm1.findnode: Ttreenode;
function findnode1(nod1:Ttreenode): Ttreenode;
var i: word;
HasChild,Selectedall: boolean;
begin
result:=nil;
HasChild:=false;
Selectedall:=true;
for i:=0 to nod1.Count-1do
begin
if nod1.Item.HasChildren then
begin
HasChild:=true;
result:=findnode1(nod1.Item);
if result<>nil then
exit;
end;
//查到该节点
if not nod1.Item.Selected then
Selectedall:=false;
end;

if (not HasChild) and Selectedall then
result:= nod1;
//查到该节点
end;
var i: word;
begin
result:=nil;
for i:=0 to TreeView1.Items.Count-1do
begin
if treeview1.Items.Level<>0 then
continue;
if treeview1.Items.HasChildren then
begin
result:=findnode1(treeview1.Items);
if result<>nil then
exit;
end;
//查到该节点
end;
end;

end.
//测试通过
 
可能是我没说清楚,一个treeview和imagelist关联,treeview的节点层次不定,ImageList有3个图片,0是节点未选中的效果,1是节点和其所有子节点被选中的效果,2是节点的子节点有的未被选中的效果。(瑞星和金山毒霸设置杀毒路径的效果类似),以上功能都已实现。
我想遍历所有节点,如果选中则找和它同一个父节点的所有同级节点,如果所有同级节点被选中,则它的父节点就是要找的。现在如何快速找到所有这样的父节点?

for i:=0 to TreeView1.Items.Count-1do
begin
if TreeView1.Items.ImageIndex =1 then
begin
我只会找到这样的节点,然后的代码就不会了
end;
end;
 
是啊,复杂了。不过yuzk2005好象是用递归做的,是上选
 
多人接受答案了。
 
后退
顶部