Mukammal ikkilik daraxt
Mukammal ikkilik daraxt (Perfect Binary Tree) — har bir ichki tugun roppa-rosa ikkita bola tugunga ega bo'lgan va barcha barg tugunlar bir xil chuqurlikda (darajada) joylashgan ikkilik daraxt turidir.

Mukammal ikkilik daraxt (Perfect Binary Tree)
Mukammal ikkilik daraxtda barcha ichki tugunlarning darajasi (degree) 2 ga teng bo'ladi.
Rekursiv ravishda mukammal ikkilik daraxt quyidagicha ta'riflanadi:
h = 0 bo'lgan mukammal ikkilik daraxtdir.h > 0 balandlikka ega bo'lsa, uning har ikkala quyi daraxti ham h - 1 balandlikdagi mukammal ikkilik daraxt bo'lsa va o'zaro tutashmasa (alohida bo'lsa), u holda butun daraxt mukammal ikkilik daraxt hisoblanadi.
Mukammal ikkilik daraxtning rekursiv ifodalanishi
Quyidagi dastur berilgan ikkilik daraxtning mukammal ikkilik daraxt ekanligini chuqurlik va qavatlarni solishtirish orqali tekshiradi.
// Go tilida daraxtning mukammal ikkilik daraxt (Perfect Binary Tree) ekanligini tekshirish
package main
import "fmt"
type Node struct {
key int
left *Node
right *Node
}
func newNode(k int) *Node {
return &Node{key: k}
}
// Daraxt chuqurligini hisoblash
func calculateDepth(node *Node) int {
if node == nil {
return 0
}
leftDepth := calculateDepth(node.left)
rightDepth := calculateDepth(node.right)
if leftDepth > rightDepth {
return leftDepth + 1
}
return rightDepth + 1
}
// Mukammal ikkilik daraxt ekanligini tekshirish
func isPerfect(root *Node, d int, level int) bool {
// Bo'sh daraxt holati
if root == nil {
return true
}
// Barg tugun holati
if root.left == nil && root.right == nil {
return d == level+1
}
// Agar faqat bitta bolasi bo'lsa
if root.left == nil || root.right == nil {
return false
}
return isPerfect(root.left, d, level+1) && isPerfect(root.right, d, level+1)
}
func main() {
root := newNode(1)
root.left = newNode(2)
root.right = newNode(3)
root.left.left = newNode(4)
root.left.right = newNode(5)
root.right.left = newNode(6)
root.right.right = newNode(7)
d := calculateDepth(root)
if isPerfect(root, d, 0) {
fmt.Println("Daraxt mukammal ikkilik daraxt (perfect binary tree)")
} else {
fmt.Println("Daraxt mukammal ikkilik daraxt EMAS (not a perfect binary tree)")
}
}