【问题标题】:Find the level of Deepest child Treenode查找最深子树节点的级别
【发布时间】:2011-11-29 12:21:45
【问题描述】:

我有树节点,我想在树节点中找到最深的孩子。 如果有 2 个子节点分别为 level 11level 13,那么我需要 unction 来返回值 13。

我该怎么做?

public int FindLevel(TreeNode oParentNode)
{
   counter++;
  forech(TreeNode oSubNode in oParentNode.Nodes)
  {
    FindLevel(oParentNode);
  }

 return Counter;
}

【问题讨论】:

  • 家庭作业?您使用的是TreeView 类型的 UI 组件还是数据结构?
  • 我已经准备好树节点,我想在 excel 文件中显示它。将树节点传递给一个函数怎么样,它会返回最深的节点。
  • @Leppie:当然!!给我一分钟。
  • 对于初学者:您需要在循环内传递 oSubNode 而不是 oParentNode
  • 我每次都必须将上一个最大级别与新级别进行比较,如果新级别更大,则用新值替换旧值..

标签: c# winforms recursion treenode


【解决方案1】:

这是我给你的建议:

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&lt;TreeNode&gt;().Select(GetDeepestChildNodeLevel); 给了我错误。你能重新确认一下代码吗?
  • 对不起,我忘了提到你必须包含一个 System.Linq 的使用。
  • 我认为这不是 linq 的错误..m 得到别的东西..将在这里粘贴
  • 方法 'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)' 的类型参数不能是从用法推断。尝试明确指定类型参数。
  • 无法从用法中推断方法“System.Linq.Enumerable.Count(System.Collections.Generic.IEnumerable)”的类型参数。尝试明确指定类型参数。
【解决方案2】:

这是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;
}

代码已经过测试并且适合我。

【讨论】:

    【解决方案3】:

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

     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 要求 find the deepest child in the treenode 而不是 selected node
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多