查找最深子树节点的层数

5
我有一个树节点,想要找到树节点中最深的子节点。如果有两个子节点分别为level 11level 13,那么我需要一个函数来返回值13。
我该怎么做?
public int FindLevel(TreeNode oParentNode)
{
   counter++;
  forech(TreeNode oSubNode in oParentNode.Nodes)
  {
    FindLevel(oParentNode);
  }

 return Counter;
}

作业?你使用的是 TreeView 类型的 UI 组件还是数据结构? - Yuck
我已经准备好了TreeNode,想要在Excel文件中显示它。将一个TreeNode传递给一个函数,该函数将返回最深层级的节点,这个方案怎么样? - Sangram Nandkhile
@ Leppie:好的!请给我一分钟。 - Sangram Nandkhile
首先:在循环内部,您需要传递 oSubNode 而不是 oParentNode - leppie
每次我都需要比较先前的最大级别和新级别,如果新级别更高,则用新值替换旧值。 - Sangram Nandkhile
3个回答

10

这是我的建议:

private int GetDeepestChildNodeLevel(TreeNode node)
{
    var subLevel = node.Nodes.Cast<TreeNode>().Select(GetDeepestChildNodeLevel);
    return subLevel.Count() == 0 ? 1 : subLevel.Max() + 1;
}

这里使用显式类型:

private int GetDeepestChildNodeLevel(TreeNode node)
{
    var subLevel = node.Nodes.Cast<TreeNode>().Select<TreeNode, int>(subNode => GetDeepestChildNodeLevel(subNode));
    return subLevel.Count<int>() == 0 ? 1 : subLevel.Max() + 1;
}

var subLevel = node.Nodes.Cast<TreeNode>().Select(GetDeepestChildNodeLevel); 给我报错了。您能再确认一下代码吗? - Sangram Nandkhile
抱歉,我忘了提到你需要在代码中加入 System.Linq 的 using。 - Fischermaen
方法 'System.Linq.Enumerable.Count<TSource>(System.Collections.Generic.IEnumerable<TSource>)' 的类型参数无法从使用中推断出。请尝试显式指定类型参数。 - Sangram Nandkhile
@CodeHippo:它在我的机器上编译通过,请尝试使用return subLevel.Count<int>() == 0 ? 1 : subLevel.Max() + 1; - Fischermaen
你使用的是WPF还是WinForms? - Fischermaen
显示剩余2条评论

1
这是一个针对 TreeView 的扩展方法,它返回该 TreeView 中最深节点的 Level
public int GetDeepestNodeLevel(this System.Windows.Forms.TreeView treeView)
{
    int level = -1;
    foreach (System.Windows.Forms.TreeNode node in treeView.Nodes) {
        int deep = DigInNodes(node);
        if (deep > level)
            level = deep;
    }
    return level;
}
private int DigInNodes(System.Windows.Forms.TreeNode node)
{
    int level = node.Level;
    foreach (System.Windows.Forms.TreeNode subnode in node.Nodes) {
        int deep = DigInNodes(subnode);
        if (deep > level)
            level = deep;
    }
    return level;
}

代码已经经过测试,我这边可以正常运行。

-2

这是获取所选节点深度的快速方法。

 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
        TreeNode node = treeView1.SelectedNode;
        MessageBox.Show(string.Format("You selected: {0}{1}", node.Text,e.Node.Level));

    }

不要解释你的错误,用户会像现实生活中一样给你点踩。OPT要求“找到树节点中最深的子节点”,而不是“选定的节点”。 - user14967521

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接