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

สร้าง Binary Tree จาก Postorder และ Inorder ใน Python

ภาพรวม

โจทย์สร้าง Binary Tree จาก inorder และ postorder traversal sequences

หลักการ

  • Postorder: Left, Right, Root → ตัวสุดท้ายคือ Root
  • Inorder: Left, Root, Right → หา Root ใน inorder แบ่ง Left/Right subtree
  • Recursive build

ตัวอย่าง

Inorder: [9, 3, 15, 20, 7]

Postorder: [9, 15, 7, 20, 3]

Root = 3 (postorder[-1])

Inorder: Left=[9], Root=3, Right=[15,20,7]

Recursive build subtrees

โค้ด Python

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

def print_tree(root):
    if root:
        print_tree(root.left)
        print(root.data, end=', ')
        print_tree(root.right)

class Solution:
    def buildTree(self, inorder, postorder):
        if inorder:
            root = TreeNode(postorder.pop())
            ind = inorder.index(root.data)
            root.right = self.buildTree(inorder[ind+1:], postorder)
            root.left = self.buildTree(inorder[:ind], postorder)
            return root

ob1 = Solution()
print_tree(ob1.buildTree([9,3,15,20,7], [9,15,7,20,3]))

ข้อสังเกต

  • postorder.pop() แก้ไขลิสต์ต้นฉบับ (destructive)
  • inorder.index() หา index ใช้เวลา O(n) รวม O(n²) worst case
  • เพิ่มประสิทธิภาพ: สร้าง dict {value: index} สำหรับ inorder

ผลลัพธ์

9, 3, 15, 20, 7,