个写递归遍历树节点,从中找到指定节点并返回。 可无论怎么写,即使找到指定节点,return后仍然继续执行递归,最终返回空值。求大侠指导正确写法。
/// <summary>
/// 依据Id遍历treeList并返回指定Id的节点
/// </summary>
/// <param name="nodes">TreeList控件Nodes</param>
/// <param name="id">要返回节点的Id</param>
/// <returns>返回的指定节点</returns>
private TreeListNode Bianli(TreeListNodes nodes, string id)
{
foreach (TreeListNode c in nodes)
{
MessageBox.Show(c.GetValue("Id").ToString());
if (c.GetValue("Id").ToString() == id)
{
return c;
}
if (c.Nodes.Count > 0)
{
//return (Bianli(c.Nodes, id));
Bianli(c.Nodes, id);
//以上两种写法都不能正确执行
}
}
return null;
}
if (c.Nodes.Count > 0)
{
//return (Bianli(c.Nodes, id));
TreeListNode c = Bianli(c.Nodes, id);
if (c != null) {
return;
}
}
return后只剩跳出当前这层的递归循环
举个例子,假设你第一层有两个需要循环 为a b
你a下面有 cde b下面有fg
如果c是你要的数据
那你从a进入到c找到以后return 只是告诉方法不再去执行de
但是当你return回到 第一层时,你还是会去执行b
所以说你得想一个办法告诉所有的节点立刻结束函数调用,需要声明一个全局变量
然后整个递归函数用if () { }
额抱歉 一开始没仔细看你写的代码。这里做一下更正。
首先 Bianli(c.Nodes, id);肯定是错的,这样只是调用了,根本没有利用返回值,所以最后除非你运气好,第一层节点中就有你需要的节点 不然肯定是返回null
然后讲一下return (Bianli(c.Nodes, id));
这里假设是第一层是 a b
a下面是 cde b下面是fg 假设需求是f
先进入a a不是 a有子节点 返回a的子节点查询结果
a的子节点查询结果为 遍历cde cde都是没有子节点的 所以不必看第二个if
cde都不是需求 所以最后会返回for外面的 return null;
a的子节点查询结果为null 再这 a就可以直接返回结果null了 所以这里的bug是当第一层节点有多个,返回结果只会是第一层的第一个节点下(如果是好几层的话并且第二层父节点也有多个,那么也只会进入第一个父节点下去查找)有没有要查找的节点。
所以修改方法就是 如果返回是null的话,就继续这个循环 去查找b
故可以改成
TreeListNode node = Bianli(c.Nodes, id);
if (node != null) {
return node;
}