อัลกอริทึม Python

ต้นไม้ค้นหาแบบทวิภาคใน Python

ต้นไม้ค้นหาแบบทวิภาคเก็บค่าที่น้อยกว่าไว้ในต้นไม้ย่อยด้านซ้าย และค่าที่มากกว่าไว้ด้านขวา การเปรียบเทียบแต่ละครั้งจึงตัดต้นไม้ที่เหลือออกไปครึ่งหนึ่ง

ต้นไม้ค้นหาแบบทวิภาคใน Python คืออะไร?

ต้นไม้ค้นหาแบบทวิภาคเก็บค่าที่น้อยกว่าไว้ในต้นไม้ย่อยด้านซ้าย และค่าที่มากกว่าไว้ด้านขวา การเปรียบเทียบแต่ละครั้งจึงตัดต้นไม้ที่เหลือออกไปครึ่งหนึ่ง

สร้างต้นไม้ค้นหาแบบทวิภาคด้วย Python: แทรกค่า ค้นหา และแสดงค่าตามลำดับ

ควรใช้เมื่อใด?

  • ทำความเข้าใจอัลกอริทึมและโครงสร้างข้อมูล
  • สังเกตแต่ละขั้นตอนและกรณีขอบ
  • เปรียบเทียบเวลาและหน่วยความจำ

ดูการทำงาน

แทรกค่าเพื่อดูว่าไปอยู่ตรงไหน ค้นหาค่าเพื่อดูเส้นทาง และรันการท่องต้นไม้เพื่อดูลำดับการเยี่ยม

โค้ดตัวอย่าง

รันโค้ด →
main.py
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 และทดสอบกรณีขอบก่อนใช้ชุดข้อมูลที่ใหญ่ขึ้น

  1. ทดสอบ input ว่าง หนึ่งสมาชิก และค่าซ้ำ
  2. แสดงสถานะหลังแต่ละขั้นตอน
  3. เปรียบเทียบประสิทธิภาพกับวิธีอื่น
รันใน Python IDE →

ฝึกด้วยโจทย์

ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI

โจทย์ทั้งหมด