Computer >> Máy Tính >  >> Lập trình >> Python

Serialize và Deserialize BST bằng Python

Giả sử chúng ta muốn thiết kế một thuật toán để tuần tự hóa và giải mã hóa một cây tìm kiếm nhị phân. Serialization là quá trình chuyển đổi một thứ gì đó (cấu trúc dữ liệu hoặc đối tượng) thành một chuỗi các bit để nó có thể được lưu trữ trong tệp hoặc bộ đệm bộ nhớ, hoặc được truyền qua một liên kết kết nối mạng. Quá trình này có thể được tạo lại sau khi quá trình giải mã hóa.

Vì vậy, nếu đầu vào giống như [5,2,9,1,3,7], thì đầu ra sẽ là Đầu ra được tuần tự hóa 5.2.9.1.3.7.N.N.N.N.N.N.N Đầu ra được hủy số hóa:1, 2, 3, 5, 7, 9, (inorder traversal)

Serialize và Deserialize BST bằng Python

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Định nghĩa một hàm serialize (). Điều này sẽ bắt nguồn từ gốc

  • res:=một danh sách mới

  • xác định một hàng đợi và chèn thư mục gốc

  • trong khi hàng đợi không trống, thực hiện

    • trong khi hàng đợi không trống, thực hiện

      • hiện tại:=queue [0]

      • chèn dòng điện vào cuối res

      • xóa phần tử đầu tiên khỏi hàng đợi

      • nếu dòng điện khác 0 thì

        • đi ra từ vòng lặp

    • nếu hiện tại là null thì

      • đi ra từ vòng lặp

    • nếu current.left không phải là null thì

      • chèn current.left vào cuối hàng đợi

    • nếu không,

      • chèn Không vào cuối hàng đợi

    • nếu current.right không phải là null, thì

      • chèn current.right vào cuối hàng đợi

    • nếu không,

      • chèn Không vào cuối hàng đợi

  • s:=chuỗi trống

  • đối với tôi trong phạm vi 0 đến kích thước của res, hãy làm

    • nếu res [i] khác 0 thì

      • s:=s nối res [i] .data

    • nếu không,

      • s:=s nối "N"

    • nếu tôi giống với kích thước của res -1, thì

      • đi ra từ vòng lặp

    • s:=s nối "."

  • trả lại s

  • Định nghĩa một hàm deserialize (). Thao tác này sẽ lấy dữ liệu

  • data:=danh sách các phần sau khi phân chia dữ liệu bằng cách sử dụng dấu chấm

  • stack:=một danh sách mới

  • nếu dữ liệu [0] giống với 'N' thì

    • trả lại Không có

  • root:=tạo một nút mới với dữ liệu dữ liệu [0]

  • chèn root vào cuối ngăn xếp

  • i:=1

  • hiện tại:=0

  • while i

    • left:=Sai

    • nếu dữ liệu [i] không giống với 'N', thì

      • temp:=tạo một nút mới với dữ liệu dữ liệu [i]

      • ngăn xếp [hiện tại] .left:=temp

      • chèn nhiệt độ vào cuối ngăn xếp

    • nếu không,

      • stack [current] .left:=Không có

    • i:=i + 1

    • nếu dữ liệu [i] không giống với 'N', thì

      • temp:=tạo một nút mới với dữ liệu dữ liệu [i]

      • ngăn xếp [hiện tại] .right:=temp

      • chèn nhiệt độ vào cuối ngăn xếp

    • nếu không,

      • stack [current] .right:=Không có

    • hiện tại:=current + 1

    • i:=i + 1

  • trả về thư mục gốc

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn -

class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.data = data
      self.left = left
      self.right = right
def insert(temp,data):
   que = []
   que.append(temp)
   while (len(que)):
      temp = que[0]
      que.pop(0)
      if (not temp.left):
         if data is not None:
            temp.left = TreeNode(data)
         else:
            temp.left = TreeNode(0)
         break
      else:
         que.append(temp.left)
      if (not temp.right):
         if data is not None:
            temp.right = TreeNode(data)
         else:
            temp.right = TreeNode(0)
         break
      else:
         que.append(temp.right)
def make_tree(elements):
   Tree = TreeNode(elements[0])
   for element in elements[1:]:
      insert(Tree, element)
   return Tree
def print_tree(root):
   #print using inorder traversal
   if root is not None:
      print_tree(root.left)
      print(root.data, end = ', ')
      print_tree(root.right)
class Codec:
   def serialize(self, root):
      res =[]
      queue = [root]
      while queue:
         while True and queue:
            current = queue[0]
            res.append(current)
            queue.pop(0)
            if current:
               break
         if not current:
            break
         if current.left:
            queue.append(current.left)
         else:
            queue.append(None)
         if current.right:
            queue.append(current.right)
         else:
            queue.append(None)
      s=""
      for i in range(len(res)):
         if res[i]:
            s+=str(res[i].data)
         else:
            s+="N"
         if i == len(res)-1:
            break
         s+="."
      return s
   def deserialize(self, data):
      data = data.split(".")
      stack = []
      if data[0]=='N':
         return None
      root = TreeNode(int(data[0]))
      stack.append(root)
      i = 1
      current = 0
      while i <len(data):
         left= False
         if data[i] !='N':
            temp = TreeNode(int(data[i]))
            stack[current].left = temp
            stack.append(temp)
         else:
            stack[current].left = None
         i+=1
         if data[i] !='N':
            temp = TreeNode(int(data[i]))
            stack[current].right = temp
            stack.append(temp)
         else:
            stack[current].right = None
         current+=1
         i+=1
         return root

ob = Codec()
root = make_tree([5,2,9,1,3,7])
ser = ob.serialize(root)
print('Serialization:',ser)
print_tree(ob.deserialize(ser))

Đầu vào

[5,2,9,1,3,7]

Đầu ra

Serialization: 5.2.9.1.3.7.N.N.N.N.N.N.N
1, 2, 3, 5, 7, 9,