我正在尝试生成一个决策树,它将显示在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 ++问题。代码可以在两种语言之间直接翻译。
能帮助我吗?
答案 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
我希望这可能对其他人有用
安德烈