树视图的决策树生成

时间:2017-10-15 18:24:21

标签: c# winforms recursion tree treeview

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

TreeView

如你所知,足球是一个目标赛事游戏,一旦进球得分,我就会进入树中的下一个节点。所以得分0 - 0是起点。该节点然后分成2个节点(1-0)和(0-1)。一旦在路径上,树需要迎合沿着该路径行进,但也适合2 - 2,3 - 2,3 - 3等

因此,树中的每个节点都需要包含前一个分数中的所有可能解决方案。我确定你明白了。

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

我用以下方法调用递归例程: Recurse(rootNode,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 ++问题。代码可以在两种语言之间直接翻译。

能帮助我吗?

1 个答案:

答案 0 :(得分:0)

我将在这里回答我自己的问题,因为我已经找到了答案。有趣的是,发布在这里帮助我重新思考问题,因为我觉得我感到困惑。感谢@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

我希望这可能对其他人有用

安德烈