Как обрезать общее дерево Tic Tac Toe Boards - Java-рекурсия - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь, чтобы каждый родительский узел (каждый узел) показывал мне, сколько выигрышей и проигрышей имеет его поддерево.

Это позволит мне играть на компьютере таким образом, чтобы он мог оптимизировать свой ход, перейдя к следующему поддереву, у которого больше всего выигрышей для О.

Сейчас я пытаюсь переставитьдерево, чтобы оно могло просто показать мне, сколько выигрышей и проигрышей имеет его поддерево.

Пока у меня есть дерево, упорядоченное так, что есть 9 поколений.

1) В первом поколении есть 8 братьев и сестер (каждый с дочерними узлами) или 8 возможных ходов для X.

2) Во втором поколении есть 7 братьев и сестер (каждый с дочерними узлами) или 7 возможныхХодит за О.

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");
                }

            }
    }

1 Ответ

0 голосов
/ 18 октября 2018

Вы ставите счетчик сразу после вызова, который будет считать все узлы, даже нулевые.измените это, чтобы быть внутри оператора 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);
...