Я смотрю на некоторые алгоритмы, связанные с двоичными деревьями. Некоторые алгоритмы бинарных деревьев структурированы по циклам, но я не знаю, как найти их 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;
}