Tương tự như:
height(t) = if (t==NULL) then 0 else 1+max(height(t.left),height(t.right))
Bạn có:
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
}
đâu hoàn hảo (t) trả về -1 nếu lá không phải là tất cả cùng một chiều sâu, hoặc bất kỳ nút chỉ có một đứa trẻ; ngược lại, nó trả về chiều cao.
Chỉnh sửa: đây là dành cho "hoàn thành" = "Cây nhị phân hoàn hảo là cây nhị phân đầy đủ, trong đó tất cả các lá ở cùng độ sâu hoặc cùng một cấp. 1 (Đây rõ ràng còn được gọi là cây nhị phân hoàn chỉnh.)" (Wikipedia).
Dưới đây là kiểm tra đệ quy cho: "Cây nhị phân hoàn chỉnh là cây nhị phân, trong đó mọi cấp, ngoại trừ có thể là cuối cùng, được điền đầy đủ và tất cả các nút càng xa càng tốt". Nó trả về (-1, false) nếu cây không hoàn thành, nếu không (chiều cao, đầy đủ) nếu nó là, với đầy đủ == true iff nó hoàn hảo.
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)
}
Nguồn
2009-09-18 05:12:49
vui lòng tham khảo http://stackoverflow.com/questions/18159884/whether-a-given-binary-tree-is-complete-or-not cho một trong những cách tiếp cận dễ dàng nhất. – Trying