Аналогично:
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
}
Где совершенна (т) возвращает -1, если листья не все на той же глубине, или любой узел имеет только один ребенок; в противном случае он возвращает высоту.
Редактировать: это для «complete» = «Идеальное двоичное дерево - это полное двоичное дерево, в котором все листья находятся на одной и той же глубине или одинаковом уровне. 1 (Это неоднозначно также называется полным двоичным деревом.)" (Wikipedia).
Рекурсивная проверка: «Полное двоичное дерево - это двоичное дерево, в котором каждый уровень, за исключением, возможно, последнего, полностью заполнен, а все узлы как можно дальше.». Он возвращает (-1, false), если дерево не является полным, иначе (высота, полная), если оно есть, с полным значением true, если оно идеально.
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)
}
пожалуйста, обратитесь к http://stackoverflow.com/questions/18159884/whether-a-given-binary-tree-is-complete-or-not для одного из самых простых подхода. – Trying