สมมติว่าเรามีต้นไม้ไบนารี เราต้องหาขนาดของ sub-tree ที่สมบูรณ์สูงสุดใน Binary Tree นี้ อย่างที่เราทราบกันดีว่าไบนารีทรีที่สมบูรณ์นั้นเป็นไบนารีทรี หากทุกระดับถูกเติมโดยสมบูรณ์โดยที่ระดับสุดท้ายอาจไม่มีคีย์ และระดับสุดท้ายมีคีย์ทั้งหมดเหลือไว้ให้มากที่สุด
ดังนั้นหากอินพุตเป็นแบบ

จากนั้นเอาต์พุตจะเป็น 4 ตามขนาด และการส่งผ่านแบบไม่เรียงลำดับจะเป็น 10, 45, 60, 70
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดประเภทการส่งคืนด้วยพารามิเตอร์ไม่กี่อย่าง เช่น isComplete, isPerfect ซึ่งในตอนแรกจะเป็นเท็จ จากนั้นจึงกำหนดขนาดและรูททรี ขนาดเริ่มต้นคือ 0 และ rootTree เป็นค่าว่าง
- ret_type :=returnType
- ถ้ารูทเป็นโมฆะ
- ret_type.isPerfect :=จริง
- ret_type.isComplete :=จริง
- ret_type.size :=0
- ret_type.rootTree :=ไม่มี
- ส่งคืน ret_type
- left_tree :=checkCompleteness(root.left)
- right_tree :=ตรวจสอบความสมบูรณ์ (root.right)
- ถ้า (left_tree.isPerfect เป็น True และ right_tree.isComplete เป็น True และความสูงของต้นไม้ซ้ายและขวาเท่ากัน ดังนั้น
- ret_type.isComplete :=จริง
- ret_type.isPerfect :=right_tree.isPerfect
- ret_type.size :=left_tree.size + right_tree.size + 1
- ret_type.rootTree :=รูท
- ส่งคืน ret_type
- ถ้า (left_tree.isComplete เป็น True และ right_tree.isPerfect เป็น True และความสูงของต้นไม้ซ้ายและขวาเท่ากัน ดังนั้น
- ret_type.isComplete :=จริง
- ret_type.isPerfect :=เท็จ
- ret_type.size :=left_tree.size + right_tree.size + 1
- ret_type.rootTree :=รูท
- ส่งคืน ret_type
- ret_type.isPerfect :=เท็จ
- ret_type.isComplete :=เท็จ
- ret_type.size :=สูงสุดของ left_tree.size, right_tree.size
- ถ้า left_tree.size> right_tree.size แล้ว
- ret_type.rootTree :=left_tree.rootTree
- มิฉะนั้น
- ret_type.rootTree :=right_tree.rootTree
- ส่งคืน ret_type
หลาม
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
import math
class TreeNode:
def __init__(self, data, left = None, right = None):
self.data = data
self.left = left
self.right = right
class returnType :
def __init__(self):
self.isPerfect = None
self.isComplete = None
self.size = 0
self.rootTree = None
def getHeight(size):
return int(math.ceil(math.log(size + 1)/math.log(2)))
def checkCompleteness(root) :
ret_type = returnType()
if (root == None):
ret_type.isPerfect = True
ret_type.isComplete = True
ret_type.size = 0
ret_type.rootTree = None
return ret_type
left_tree = checkCompleteness(root.left)
right_tree = checkCompleteness(root.right)
if (left_tree.isPerfect == True and right_tree.isComplete == True and getHeight(left_tree.size) == getHeight(right_tree.size)) :
ret_type.isComplete = True
ret_type.isPerfect = right_tree.isPerfect
ret_type.size = left_tree.size + right_tree.size + 1
ret_type.rootTree = root
return ret_type
if (left_tree.isComplete == True and right_tree.isPerfect == True and getHeight(left_tree.size) == getHeight(right_tree.size) + 1):
ret_type.isComplete = True
ret_type.isPerfect = False
ret_type.size = left_tree.size + right_tree.size + 1
ret_type.rootTree = root
return ret_type
ret_type.isPerfect = False
ret_type.isComplete = False
ret_type.size =max(left_tree.size, right_tree.size)
if(left_tree.size > right_tree.size ):
ret_type.rootTree = left_tree.rootTree
else:
ret_type.rootTree = right_tree.rootTree
return ret_type
def print_tree(root):
if root is not None:
print_tree(root.left)
print(root.data, end = ', ')
print_tree(root.right)
root = TreeNode(50)
root.left = TreeNode(30)
root.right = TreeNode(60)
root.left.left = TreeNode(5)
root.left.right = TreeNode(20)
root.right.left = TreeNode(45)
root.right.right = TreeNode(70)
root.right.left.left = TreeNode(10)
ans = checkCompleteness(root)
print( "Size:" , ans.size )
print("Inorder Traversal: ", end = '')
print_tree(ans.rootTree) อินพุต
root = TreeNode(50) root.left = TreeNode(30) root.right = TreeNode(60) root.left.left = TreeNode(5) root.left.right = TreeNode(20) root.right.left = TreeNode(45) root.right.right = TreeNode(70) root.right.left.left = TreeNode(10)
ผลลัพธ์:
Size: 4 Inorder Traversal: 10, 45, 60, 70,