求一个递归算法(进来拿分!)

hehaoliang 2003-08-19 03:38:21
在treeview控件中,我想删除一个节点,那么就要删除该节点下的所有子节点,这要用到递归,我数据库中的表结构如下:
ID NAME PARENT_ID
1 AAA 0
2 BBB 1
3 CCC 1
我在treeview中用指针存储了id,请问程序中怎么实现!急!!!!
...全文
31 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Niuniu2003 2003-12-05
  • 打赏
  • 举报
回复
//补充
procedure TForm1.Delete(send:Object);
begin
NodeDelete(TreeView.Selected);
treeView.Selected.delete;
end;

procedure NodeDelete(Node: TTreeNode);
var
p_Node: TTreeNode;
SQL: String;
ID: string;
begin
while Node.HasChildren do
begin
p_Node := Node.GetFirstChild;
if P_Node.HasChildRen then
NodeDelete(p_Node);//递归
delete(P_Node);
end;

ID:= TYourType(Node.Data).ID;
SQL:= 'Delete from table where ID = '''+ID+'''';
EXESQL(ADOQuery,SQL,True);
end;
Niuniu2003 2003-12-05
  • 打赏
  • 举报
回复
procedure TForm1.Delete(send:Object);
begin
NodeDelete(TreeView.Selected);

end;

procedure NodeDelete(Node: TTreeNode);
var
p_Node: TTreeNode;
SQL: String;
ID: string;
begin
while Node.HasChildren do
begin
p_Node := Node.GetFirstChild;
if P_Node.HasChildRen then
NodeDelete(p_Node);//递归
delete(P_Node);
end;

ID:= TYourType(Node.Data).ID;
SQL:= 'Delete from table where ID = '''+ID+'''';
EXESQL(ADOQuery,SQL,True);
end;
prosectinfo 2003-12-05
  • 打赏
  • 举报
回复
to:hehaoliang(浩浩) 我真服了你了
cnhxjt 2003-11-11
  • 打赏
  • 举报
回复
都是高人
lxpbuaa 2003-08-19
  • 打赏
  • 举报
回复
hehaoliang(浩浩)(▲ ) ,你这个大……………………好人:
我在上面不是告诉你:
//删除数据库中ID为ParentNode.AbsoluteIndex到 ParentNode.AbsoluteIndex+C的记录,而C已经求出来了,用一个SQL语句就可以完成这些记录的删除了啊!!!

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
fengjn 2003-08-19
  • 打赏
  • 举报
回复
虽然有很多接点,但是他们的PARENT_ID 是相同的。所以没有必要找到每一个。
hehaoliang 2003-08-19
  • 打赏
  • 举报
回复
天啊,真的没人有正确的回答吗?想不通,我要的是删除数据库中不定层的子节点啊
hehaoliang 2003-08-19
  • 打赏
  • 举报
回复
错了,老兄,一个节点下面有很多子节点啊,不只是一层啊,看来是要自己想办法了
fengjn 2003-08-19
  • 打赏
  • 举报
回复
procedure TForm1.Delete(node: TTreeNode);
var
T: TTreeNode;
SQL: String;
ID: string;
begin
ID:= TYourType(Node.Data).ID;
SQL:= 'Delete from table where id ='+ID+' or PARENT_ID = '+ID;
EXESQL(ADOQuery,SQL,True);
if node.HasChildren then
begin
t:= node.getFirstChild;
delete(t);
end;
TreeView1.Items.Delete(node);
end;
hehaoliang 2003-08-19
  • 打赏
  • 举报
回复
我不是说删除treeview啊,是删除数据库中的数据啊
prosectinfo 2003-08-19
  • 打赏
  • 举报
回复
删除时可不用递归
创建树时可能用递归

全局变量:
delid:string //保存要删除的所有id

procedure deleteA(Node:TTreeNode);
begin
//删除树节点
deleteNode(Node);
//删除数据库纪录
delid:='('+Copy(delid,1,Length(delid)-1)+')';
With Tquery.Create(self) do
begin
DataBaseName:='XXXXXXXXXXXXXX'
Sql.text:='delete from xxc where id in '+delid;
ExecSql;
free;
end;
end;

procedure deleteNode(node: TTreeNode);
var
T: TTreeNode;
p:^Integer;
begin
while node.HasChildren do
begin
t:= node.getFirstChild;
deleteNode(t);
end;
p:=Node.Data;
delid:=delid+p^+','
Dispose(p);
TreeView1.Items.Delete(node);
end;

不递归时根据TTreeNode.Level 纪录某一个节点下的所有子节点
然后一次性删除




lxpbuaa 2003-08-19
  • 打赏
  • 举报
回复
可以不用递归(当然用也是可以的):
var
ParentNode,CurrentNode: TTreeNode;
L,C: Integer;
begin
// ParentNode := ;
if not ParentNode.HasChildren then Exit;
C := 0;
CurrentNode := ParentNode.GetNext;
L := CurrentNode.Level;
while L > ParentNode.Level do
begin
Inc(C);
CurrentNode := ParentNode.GetNext;
L := CurrentNode.Level;
end;
//删除数据库中ID为ParentNode.AbsoluteIndex到 ParentNode.AbsoluteIndex+C的记录
ParentNode.Delete;
end;

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
fengjn 2003-08-19
  • 打赏
  • 举报
回复
不递归的
procedure Delete(node: TTreeNode);
begin
TreeView1.Items.Delete(node);
end;
charles2118 2003-08-19
  • 打赏
  • 举报
回复
procedure TForm1.Delete(node: TTreeNode);
var
T: TTreeNode;
begin
while node.HasChildren do
begin
t:= node.getFirstChild;
delete(t);
end;
TreeView1.Items.Delete(node);
end;
fengjn 2003-08-19
  • 打赏
  • 举报
回复
好象没有必要递归吧,非递归也不反对。
procedure TForm1.Delete(node: TTreeNode);
var
T: TTreeNode;
begin
if node.HasChildren then
begin
t:= node.getFirstChild;
delete(t);
end;
TreeView1.Items.Delete(node);
end;
DJ_KK 2003-08-19
  • 打赏
  • 举报
回复
up

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧