Как найти инвариант l oop этого алгоритма? - PullRequest
0 голосов
/ 10 января 2020

Я смотрю на некоторые алгоритмы, связанные с двоичными деревьями. Некоторые алгоритмы бинарных деревьев структурированы по циклам, но я не знаю, как найти их oop инварианты. Например, как найти инварианты l oop этого алгоритма: Определить, является ли двоичное дерево полным двоичным деревом, следующим образом:

class Main {

// Function to check if given Binary Tree is Complete or not
public static boolean isComplete(Node root)
{
    // return if tree is empty
    if (root == null) {
        return false;
    }

    // create an empty queue and enqueue root node
    Queue<Node> queue = new ArrayDeque<>();
    queue.add(root);

    // pointer to store current node
    Node front;

    // flag to mark end of full nodes
    boolean flag = false;

    // run till queue is not empty
    while (!queue.isEmpty())
    {
        // pop front node from the queue
        front = queue.poll();

        // if we have encountered a non-full node before and current node
        // is not a leaf, tree cannot be complete tree
        if (flag && (front.left != null || front.right != null)) {
            return false;
        }

        // if left child is empty & right child exists, tree cannot be complete
        if (front.left == null && front.right != null) {
            return false;
        }

        // if left child exists, enqueue it
        if (front.left != null) {
            queue.add(front.left);
        }
        // if current node is a non-full node, set flag to true
        else {
            flag = true;
        }

        // if right child exists, enqueue it
        if (front.right != null) {
            queue.add(front.right);
        }
        // if current node is a non-full node, set flag to true
        else {
            flag = true;
        }
    }

    return true;
}
...