Java-программа для поиска всех несгоревших узлов при запуске узла в двоичном дереве - PullRequest
0 голосов
/ 11 марта 2019

Предположим, что двоичный узел горит, случайный узел (задан) сожжен, через 1 секунду все узлы, подключенные к этому узлу, сожжены, а еще через 1 секунду все узлы, подключенные к этим сожженным узлам, сожжены.

Через k секунд какие узлы остаются?

enter image description here

В этом двоичном дереве предположим, что узел D сожжен, через 1 секунду узлы B, E и C начнут гореть, а еще через 1 секунду сгорят узлы F и A. После этого сгорит G, затем в следующую секунду, Я сожгу, а после этого сожжет H.

1 Ответ

1 голос
/ 11 марта 2019

В этом двоичном дереве предположим, что узел D сожжен [<- 0 секунд], через 1 секунду узлы B, E и C начнут гореть [<- 1 секунда], а еще через 1 секунду узлы F и A будут сжечь [<- 2 сек]. После этого G сгорит [<- 3 с], затем в следующую секунду я сгорю [<- 4 с] и после этого H сгорит. [<- 5 секунд] </p>

  • [ввод]
  • Использовать очередь записи узлов.
  • Каждую секунду, записывайте все узлы, подключенные к любому узлу в очереди, вам придется использовать другой список, чтобы сохранить это. т.е. isBurned[someIndex] или isBurned.leftNode.rightNode = true.
  • Вывод всех не сгоревших узлов или других данных.

Это, вероятно, слишком много. Это неполная модель того, как ваш ответ может работать.

import java.util.LinkedList;

import java.util.Scanner;

public class Test2 {

private static Character[] toArray (LinkedList<Character> L, char Char) {
    Character[] ReturnedList = new Character[L.size() + 1];
    for(int i=0; i<L.size(); i++) {
        ReturnedList[i] = L.get(i);
    }
    ReturnedList[L.size()-1] = Char; // It needs to be longer because it's used for the left and right
    //nodes, and they need an extra L or R to show they are on the left or right side
    return ReturnedList;
}
private static class Node { // for binary tree
    LinkedList <Character> spot = new LinkedList <Character>();
    Node left  = new Node(toArray(spot, 'L'));
    Node right = new Node(toArray(spot, 'R')); // left side and right side extention of tree, may stay as null
    boolean isBurned = false; 

    char name = ' '; // unused.
    ///9183947/java-programma-dlya-poiska-vseh-nesgorevshih-uzlov-pri-zapuske-uzla-v-dvoichnom-dereve
    public Node(Character [] args) { // either L [left] or R [right]
        for(int i=0; i<args.length; i++) {
            spot.add(args[i]);
        }
    }

}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc = new Scanner (System.in);
    Node tree = new Node(new Character[0]);
    tree.name = 'F';
    tree.left.name = 'B';
    tree.right.name = 'G';
    tree.left.left.name = 'A'; //tree is a node
    tree.left.right.left.name = 'C';
    tree.right.right.name = 'I';
    tree.right.right.left.name = 'H';
    tree.left.right.name = 'D';
    tree.left.right.right.name = 'E';

    //[set a node on fire with whatever you'd like]
    tree.left.right.left.isBurned = true;
    LinkedList <Character[]> Queue = new LinkedList<Character[]>();
    Character [] placeholder = {'L', 'R', 'L'};
    Queue.add(placeholder);

    int seconds = sc.nextInt();

    while(!Queue.isEmpty()) {
        ///////////Variables/////////
        Character[] X = Queue.pop(); // List of directions
        Node Y = new Node(X);
        Y = tree; // start here and go down
        ///////////Location//////////
        for(int i=0; i<X.length; i++) {
            if(X[i] == 'L') {
                Y = Y.left; // keep on going right or left.
            }
            else {
                Y = Y.right;
            }
            ///////////Burning///////////////

            //Think about it. How would you find a node that is connected to the burning node?
            //Don't forget to add newly burning nodes, and don't add nodes that have already burned.
            //The character array, X, is a way you could manage this with.
        }

    }

    /*
         F
        / \
       /   \
      B     G
     / \     \
    A   D     I
       / \   /
      C   E H
     */
    }

}

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

...