Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมเดินทางใน Binary Tree ตามคำสั่ง L/R/U (Python)

ปัญหา

กำหนด Binary Tree และ list moves = ["R", "L", "U"] เริ่มจาก root:
R = ไป right child, L = ไป left child, U = กลับไป parent
หาค่า node ที่หยุดสุดท้าย

ตัวอย่าง: Tree: 2→right→4→left→3, moves=["R","R","U","L"] → 3

วิธีแก้: เก็บ Path (Stack)

ใช้ list `past` เก็บ node ที่ผ่านมา เพื่อกลับไป parent ได้

อัลกอริทึม

  1. past = []
  2. สำหรับแต่ละ move:
    • push root ปัจจุบันเข้า past
    • L: root = root.left
    • R: root = root.right
    • U: pop past 2 ครั้ง (pop ปัจจุบัน, pop parent) → root = parent
  3. คืนค่า root.val

โค้ด Python

class TreeNode:
    def __init__(self, data, left=None, right=None):
        self.val = data
        self.left = left
        self.right = right

class Solution:
    def solve(self, root, moves):
        past = []
        for move in moves:
            past.append(root)
            if move == "L":
                root = root.left
            elif move == "R":
                root = root.right
            else:  # "U"
                past.pop()        # pop current
                root = past.pop() # pop parent, set as current
        return root.val

# ทดสอบ
ob = Solution()
root = TreeNode(2)
root.right = TreeNode(4)
root.right.left = TreeNode(3)
root.right.right = TreeNode(5)

traverse = ["R", "R", "U", "L"]
print(ob.solve(root, traverse))  # 3

# Trace:
# Start: 2, past=[]
# R: past=[2], root=4
# R: past=[2,4], root=3
# U: past=[2,4,3], pop→3, pop→4, root=4
# L: past=[2,4], root=3
# Result: 3

ความซับซ้อน

  • Time: O(m) - m = จำนวน moves
  • Space: O(m) - stack past

สมมติฐาน

  • Moves เสมอ valid (ไม่เดินนอก tree)
  • Tree มี parent pointer ไม่ได้ → ต้องเก็บ path เอง

ประยุกต์: Tree Navigation

ใช้ใน file system traversal, DOM navigation, game tree search