Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 BST 직렬화 및 역직렬화

<시간/>

이진 검색 트리를 직렬화 및 역직렬화하는 알고리즘을 설계한다고 가정합니다. 직렬화는 파일이나 메모리 버퍼에 저장하거나 네트워크 연결 링크를 통해 전송할 수 있도록 무언가(데이터 구조 또는 개체)를 비트 시퀀스로 변환하는 프로세스입니다. 나중에 재구성할 수 있으며 이 프로세스는 직렬화 해제입니다.

따라서 입력이 [5,2,9,1,3,7]과 같으면 출력은 직렬화된 출력 5.2.9.1.3.7.N.N.N.N.N.N.N 직렬화된 출력이 됩니다. 1, 2, 3, 5, 7, 9, (중위 순회)

Python에서 BST 직렬화 및 역직렬화

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • serialize() 함수를 정의합니다. 이것은 뿌리를 내릴 것입니다

  • res :=새 목록

  • 하나의 대기열을 정의하고 루트 삽입

  • 대기열이 비어 있지 않은 동안 수행

    • 대기열이 비어 있지 않은 동안 수행

      • 현재 :=대기열[0]

      • res의 끝에 전류 삽입

      • 대기열에서 첫 번째 요소 삭제

      • 전류가 0이 아니면

        • 루프에서 나오다

    • 현재가 null이면

      • 루프에서 나오다

    • current.left가 null이 아니면

      • 큐 끝에 current.left 삽입

    • 그렇지 않으면

      • 대기열 끝에 없음 삽입

    • current.right가 null이 아니면

      • 큐 끝에 current.right 삽입

    • 그렇지 않으면

      • 대기열 끝에 없음 삽입

  • s:=빈 문자열

  • 범위 0에서 res 크기까지의 i에 대해

    • res[i]가 0이 아니면

      • s :=s 연결 res[i].data

    • 그렇지 않으면

      • s :=s "N" 연결

    • i가 res -1의 크기와 같으면

      • 루프에서 나오다

    • s :=s 연결 "."

  • 반환 s

  • deserialize() 함수를 정의합니다. 데이터가 필요합니다

  • data :=데이터를 점으로 나눈 부분의 목록

  • 스택 :=새 목록

  • data[0]이 'N'과 같으면

    • 반환 없음

  • root :=데이터 데이터로 새 노드 생성[0]

  • 스택 끝에 루트 삽입

  • 나는 :=1

  • 현재 :=0

  • 동안 <데이터 크기, 수행

    • 왼쪽:=거짓

    • data[i]가 'N'과 같지 않으면

      • temp :=데이터 데이터로 새 노드 생성[i]

      • 스택[현재].left :=임시

      • 스택 끝에 temp 삽입

    • 그렇지 않으면

      • 스택[현재].left :=없음

    • 나는 :=나는 + 1

    • data[i]가 'N'과 같지 않으면

      • temp :=데이터 데이터로 새 노드 생성[i]

      • 스택[현재].right :=임시

      • 스택 끝에 temp 삽입

    • 그렇지 않으면

      • 스택[현재].right :=없음

    • 현재 :=현재 + 1

    • 나는 :=나는 + 1

  • 루트 반환

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

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))

입력

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

출력

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