我试图使每个父节点(每个节点)向我展示其子树有多少个赢与输。
这将使我能够玩一台计算机,以便计算机可以转到下一个对O获胜最多的子树来优化其移动。
现在,我正在尝试重新排列树,以便它可以简单地向我显示其子树有多少个获利和失利。
到目前为止,我有一棵排序为9代的树。
1)第一代有8个兄弟姐妹(每个都有子节点)或X的8种可能举动。
2)第二代有7个兄弟姐妹(每个兄弟姐妹都有子节点)或7种可能的O动作。
3)一直持续到上一代兄弟姐妹为零且板满。
4)我有986410个可能的(完整和不完整)木板。
此方法当前在整棵树中打印所有可能的获胜数(对于X和O)。但是,它会使树节点的数量增加一倍,当它应小于原始数量时,因为并非所有节点都是获胜者。
public void postOrderTraverse(TreeNode T) {
counter++;
if (T == null) {
return;
} else {
postOrderTraverse(T.firstChild);
postOrderTraverse(T.nextSibling);
// checks diagonals, horizontals and verticals for a set of X's or O's
if (winOrProgress(T.board, X) == true || winOrProgress(T.board, O) == true) {
// prints the game board at this node
char[][] gameBoard = T.board;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
char value = gameBoard[i][j];
System.out.print(value);
}
}
T.firstChild = T;
System.out.print(counter);
System.out.println("Win");
}
}
}
答案 0 :(得分:0)
您在呼叫后放置了计数器,该计数器将计算所有节点,即使是空节点也是如此。 将其更改为else语句中。但这只是您问题的一部分。这将正确计算所有节点,而不仅仅是获胜者。如果您只想计算获胜的节点,则需要将其放入该捕获,而不是其他。
public void postOrderTraverse(TreeNode T) {
if (T == null) {
return;
} else {
counter++; //this is where you need to put counter, not before the actual call that way you are not counting null nodes. which you would be adding at most 2 nodes for every node that doesn't have any children.
postOrderTraverse(T.firstChild);
postOrderTraverse(T.nextSibling);