Аналогично:
height(t) = if (t==NULL) then 0 else 1+max(height(t.left),height(t.right))
У вас есть:
perfect(t) = if (t==NULL) then 0 else {
let h=perfect(t.left)
if (h != -1 && h==perfect(t.right)) then 1+h else -1
}
Где perfect (t) возвращает -1, если листья не все на одной глубине или у любого узла есть только один дочерний элемент; в противном случае возвращается высота.
Редактировать: это для "complete" = "Совершенное двоичное дерево - это полное двоичное дерево, в котором все листья находятся на одной глубине или на одном уровне. 1 (Это также неоднозначно называется полным двоичное дерево.) "( Wikipedia ).
Вот рекурсивная проверка: «Полное двоичное дерево - это двоичное дерево, в котором каждый уровень, за исключением, возможно, последнего, полностью заполнен, а все узлы расположены как можно левее». Он возвращает (-1, ложь), если дерево не завершено, в противном случае (высота, полное), если оно есть, с полным == истина, если оно идеально.
complete(t) = if (t==NULL) then (0,true) else {
let (hl,fl)=complete(t.left)
let (hr,fr)=complete(t.right)
if (fl && hl==hr) then (1+h,fr)
else if (fr && hl==hr+1) then (1+h,false)
else (-1,false)
}