我正在尝试生成一个决策树,它将显示在 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/