c# - TreeView 的决策树生成

标签 c# winforms recursion tree treeview

我正在尝试生成一个决策树,它将显示在 TreeView 中。这是一个足球游戏开发者界面。它将允许用户将事件添加到特定节点。我遇到的问题是生成所有节点。当使用链表时,可以共享路径交叉的节点,但这不能在 TreeView 中使用,因为节点会混淆。我这里有一张图片:

TreeView

如您所知,足球是一个进球事件游戏,一旦进球,我就会进入树中的下一个节点。所以 0 - 0 的分数是起点。然后该节点 split 为 2 个节点 (1 - 0) 和 (0 - 1)。一旦在路径上,树就需要满足沿着该路径行进的需求,但也需要满足 2 - 2、3 - 2、3 - 3 等

因此树中的每个节点都需要包含先前分数的所有可能解决方案。我相信您明白了。

递归的最大分数或退出点定义为: (主场 + 客场)< 8

我调用递归例程: 递归(根节点, 0, 0);

函数 CreateNodeFromScore 可以创建精美的节点并且效果很好。

我的递归代码在这里:

private void Recurse(TreeNode node, int iHome, int iAway) {

  if ((iHome + iAway) == 8 ) {
    return;
  }

  node.Nodes.Add( CreateNodeFromScore(iHome, iAway) );

  TreeNode nextNode = node.Nodes[0];
  Recurse(nextNode, ++iHome, iAway);
  Recurse(nextNode, iHome, ++iAway);
}

private void CreateNodeFromScore(int iHome, int iAway) {
    return new TreeNode(iHome.ToString() + " - " + iAway.ToString());
}

我已经尝试了很多方法来让它工作,但我找不到解决方案。

这是一个算法问题而不是gui、treeview或C#、C++问题。代码几乎可以在两种语言之间直接翻译。

有什么可以帮助我的吗?

最佳答案

我要在这里回答我自己的问题,因为我已经找到答案了。有趣的是,在这里发帖帮助我重新思考了这个问题,因为我觉得自己很困惑。感谢@dbc 的建议和指点。

private void Recurse(TreeNode node, int iHome, int iAway) {

  if ((iHome + iAway)> 7)
    return;

  var homeNode = CreateNodeFromScore(iHome +1, iAway);
  var awayNode = CreateNodeFromScore(iHome, iAway + 1);

  node.Nodes.Add(homeNode);
  node.Nodes.Add(awayNode);

  Recurse(homeNode, iHome +1, iAway);
  Recurse(awayNode, iHome, iAway +1);

}

产生这个结果:

https://i.imgur.com/ztnbRDA.png

我希望这对其他人有用

安德里亚

关于c# - TreeView 的决策树生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758490/

相关文章:

c# - 无法在 javascript 中获取 html 文本框的值

c# - 如何本地化 DataTable 列名称

vb.net - 如何显示标签 'Error on ErrorProvider1'

winforms - Report Viewer 14.0 可再发行

c# - 在另一个窗口之上叠加一个顶层窗口

javascript - Eloquent JavaScript 递归示例如何以返回 1 终止但仍输出指数值

来自数组的 Ruby 深层嵌套哈希

c# 7 元组不工作(roslyn 编译器异常)

json - 在递归结构中序列化 JSON

c# - 使用 Flash 客户端和 .NET 服务器端的 Facebook 多人 Canvas 游戏