递归找某树结点,如何找到就退出?

NewBabyNiu 2010-01-29 06:55:41
每个树结点的数据结构如下: (每个结点可能有0....N个结点)

public class Node
{
public string Name;
public int ID;
public Node[] SubNode;
}

现在已知树的跟结点跟ID, 想找到这个结点.通过如下的递归是找不到的:
private Node FindNode(Node node, int id)
{
if (node.ID == id)
return node;
else
{
if (node.SubNode != null)
{
for (int i = 0; i < node.SubNode.Length; i++)
{
FindNode(node.SubNode[i], id);
}
}
}
return null;
}

就算找到了这个结点,它还会结下来往下找,在很多情况下找到的都是null, 不要return null又不行,
请问该如何修改上述代码?




...全文
124 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouc_ajax 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qldsrx 的回复:]
for语句循环的问题,不然单纯的递归是不会立刻返回null的。我感觉可以做个变量来记录,那样更合适:
public Node FindNode(Node node, int id)
        {
            Node newnode = null;
            if (node.ID == id)
                newnode = node;
            else
            {
                if (node.SubNode != null)
                {
                    for (int i = 0; i < node.SubNode.Length; i++)
                    {
                        newnode = FindNode(node.SubNode[i], id);
                    }
                }
            }
            return newnode;
        }

[/Quote]

呵呵,不是和你较真啊,你这样是会返回null吧?
1-21-31
-22-32 如果寻找31,这样第一层for循环,查找到31后(递归出来的),还是会继续for循环,而使得
节点成为null。
有误勿怪!仅为商讨
daiyueqiang2045 2010-01-29
  • 打赏
  • 举报
回复
这个可以用FOR循环做 而且效率要比递归高。

private Node FindNode(Node node, int id)
{
Node n=null
if (node.ID == id)
n=node;
else
{
if (node.SubNode != null)
{
for (int i = 0; i < node.SubNode.Length; i++)
{
n= FindNode(node.SubNode[i], id);
if(n!=null)
break;
}
}
}
return n;
}
wuyq11 2010-01-29
  • 打赏
  • 举报
回复
private Node FindNode(Node node, int id)
{
Node n=null
if (node.ID == id)
n=node;
else
{
if (node.SubNode != null)
{
for (int i = 0; i < node.SubNode.Length; i++)
{
n= FindNode(node.SubNode[i], id);
}
}
}
return n;
}
qldsrx 2010-01-29
  • 打赏
  • 举报
回复
for语句循环的问题,不然单纯的递归是不会立刻返回null的。我感觉可以做个变量来记录,那样更合适:
public Node FindNode(Node node, int id)
{
Node newnode = null;
if (node.ID == id)
newnode = node;
else
{
if (node.SubNode != null)
{
for (int i = 0; i < node.SubNode.Length; i++)
{
newnode = FindNode(node.SubNode[i], id);
}
}
}
return newnode;
}
ouc_ajax 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qldsrx 的回复:]
只要这样就没问题了:
C# codepublic Node FindNode(Node node,int id)
{if (node.ID== id)return node;else
{if (node.SubNode!=null)
{for (int i=0; i< node.SubNode.Length; i++)
{return FindNode(node.SubNode[i], id);
}
}
}returnnull;
}
[/Quote]

这样查询会有问题的吧? 第一个枝子节点最后查询不到返回的的是null,也会返回null
判断下吧
public Node FindNode(Node node, int id)
{
if (node.ID == id)
return node;
else
{
if (node.SubNode != null)
{
for (int i = 0; i < node.SubNode.Length; i++)
{
Node nodeResult = FindNode(node.SubNode[i], id);
if(nodeResult != null)
{
return nodeResult ;
}
}
}
}
return null;
}
NewBabyNiu 2010-01-29
  • 打赏
  • 举报
回复
结果还是一样, :)
谢谢先
qldsrx 2010-01-29
  • 打赏
  • 举报
回复
只要这样就没问题了:

public Node FindNode(Node node, int id)
{
if (node.ID == id)
return node;
else
{
if (node.SubNode != null)
{
for (int i = 0; i < node.SubNode.Length; i++)
{
return FindNode(node.SubNode[i], id);
}
}
}
return null;
}

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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