ต้นไม้ค้นหาแบบทวิภาคใน Python
ต้นไม้ค้นหาแบบทวิภาคเก็บค่าที่น้อยกว่าไว้ในต้นไม้ย่อยด้านซ้าย และค่าที่มากกว่าไว้ด้านขวา การเปรียบเทียบแต่ละครั้งจึงตัดต้นไม้ที่เหลือออกไปครึ่งหนึ่ง
ต้นไม้ค้นหาแบบทวิภาคใน Python คืออะไร?
ต้นไม้ค้นหาแบบทวิภาคเก็บค่าที่น้อยกว่าไว้ในต้นไม้ย่อยด้านซ้าย และค่าที่มากกว่าไว้ด้านขวา การเปรียบเทียบแต่ละครั้งจึงตัดต้นไม้ที่เหลือออกไปครึ่งหนึ่ง
สร้างต้นไม้ค้นหาแบบทวิภาคด้วย Python: แทรกค่า ค้นหา และแสดงค่าตามลำดับ
ควรใช้เมื่อใด?
- ทำความเข้าใจอัลกอริทึมและโครงสร้างข้อมูล
- สังเกตแต่ละขั้นตอนและกรณีขอบ
- เปรียบเทียบเวลาและหน่วยความจำ
ดูการทำงาน
แทรกค่าเพื่อดูว่าไปอยู่ตรงไหน ค้นหาค่าเพื่อดูเส้นทาง และรันการท่องต้นไม้เพื่อดูลำดับการเยี่ยม
โค้ดตัวอย่าง
class Node:
def __init__(self, value):
self.value = value
self.left = None # smaller values go left
self.right = None # larger values go right
def insert(node, value):
if node is None:
return Node(value)
if value < node.value:
node.left = insert(node.left, value)
elif value > node.value:
node.right = insert(node.right, value)
return node
def contains(node, value):
# Each comparison discards one whole subtree.
while node is not None:
if value == node.value:
return True
node = node.left if value < node.value else node.right
return False
def inorder(node):
# Left subtree, node, right subtree: visits values in sorted order.
if node is None:
return []
return inorder(node.left) + [node.value] + inorder(node.right)
def height(node):
if node is None:
return 0
return 1 + max(height(node.left), height(node.right))
root = None
for value in [50, 30, 70, 20, 40, 60, 80]:
root = insert(root, value)
print("inorder:", inorder(root))
print("contains 60:", contains(root, 60))
print("contains 65:", contains(root, 65))
print("height:", height(root))
ผลลัพธ์ที่คาดหวัง
inorder: [20, 30, 40, 50, 60, 70, 80]
contains 60: True
contains 65: False
height: 3
หลักการทำงาน
insert() เดินลงจากราก แล้วต่อค่าเข้าตรงตำแหน่งที่ควรอยู่ ส่วน contains() เดินตามเส้นทางเดียว ซึ่งใช้ O(log n) ขั้นในต้นไม้ที่สมดุล การท่องแบบ inorder เยี่ยมซ้าย โหนด แล้วขวา ค่าจึงออกมาเรียงลำดับ
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัด
ลองเปลี่ยน input และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น
- ทดสอบ input ว่าง หนึ่งสมาชิก และค่าซ้ำ
- แสดงสถานะหลังแต่ละขั้นตอน
- เปรียบเทียบประสิทธิภาพกับวิธีอื่น
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- Tree Diameter A tree is a connected undirected graph with no cycles. ปานกลาง
- ขนาดโฟลเดอร์ด้วย Composite คำนวณขนาดรวมของทุกโฟลเดอร์ในต้นไม้ที่โฟลเดอร์ประกอบด้วยไฟล์และโฟลเดอร์อื่น ๆ ปานกลาง