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

연결 목록을 사용하여 이진 트리를 구현하는 Python 프로그램

<시간/>

연결 리스트를 이용하여 이진 트리 데이터 구조를 구현해야 하는 경우 루트 노드를 설정하는 방법, in-order traversal을 수행하는 방법, 루트 노드의 왼쪽에 요소를 삽입하는 방법, 요소를 삽입하는 방법 루트 노드의 오른쪽에 값을 검색하는 방법이 정의되어 있습니다.

아래는 동일한 데모입니다 -

예시

class BinaryTree_structure:
   def __init__(self, key=None):
      self.key = key
      self.left = None
      self.right = None

   def set_root(self, key):
      self.key = key

   def in_order_traversal(self):
      if self.left is not None:
         self.left.in_order_traversal()
      print(self.key, end=' ')
      if self.right is not None:
         self.right.in_order_traversal()

   def insert_left(self, new_node):
      self.left = new_node

   def insert_right(self, new_node):
      self.right = new_node

   def search_val(self, key):
      if self.key == key:
         return self
      if self.left is not None:
         temp = self.left.search_val(key)
         if temp is not None:
            return temp
      if self.right is not None:
         temp = self.right.search_val(key)
         return temp
      return None

btree = None

print('Menu (this assumes no duplicate keys)')
print('insert <data> at root')
print('insert <data> left of <data>')
print('insert <data> right of <data>')
print('quit')

while True:
   print('The inorder traversal of binary tree ', end='')
   if btree is not None:
      btree.in_order_traversal()
   print()

   do = input('What would you like to do? ').split()

   operation = do[0].strip().lower()
   if operation == 'insert':
      data = int(do[1])
      new_node = BinaryTree_structure(data)
      sub_op = do[2].strip().lower()
      if sub_op == 'at':
         btree = new_node
      else:
         position = do[4].strip().lower()
         key = int(position)
         ref_node = None
         if btree is not None:
            ref_node = btree.search_val(key)
         if ref_node is None:
            print('No such key exists')
            continue
         if sub_op == 'left':
            ref_node.insert_left(new_node)
         elif sub_op == 'right':
            ref_node.insert_right(new_node)
      elif operation == 'quit':
         break

출력

Menu (this assumes no duplicate keys)
insert <data> at root
insert <data> left of <data>
insert <data> right of <data>
quit
The inorder traversal of binary tree
What would you like to do? insert 45 at root
The inorder traversal of binary tree 45
What would you like to do? insert 78 left of 45
The inorder traversal of binary tree 78 45
What would you like to do? insert 90 right of 45
The inorder traversal of binary tree 78 45 90
What would you like to do? quit

설명

  • 'BinaryTree_structure' 클래스가 생성됩니다.

  • 트리의 루트 값을 설정하는 데 도움이 되는 'set_root' 기능이 있습니다.

  • 'in_order_traversal'이라는 메서드가 정의되어 'Left->Node->Right' 순서로 트리를 탐색하는 데 도움이 됩니다.

  • 루트 값의 왼쪽에 요소를 추가하는 데 도움이 되는 'insert_left'라는 또 다른 메서드가 정의되어 있습니다.

  • 루트 값의 오른쪽에 요소를 추가하는 데 도움이 되는 'insert_right'라는 또 다른 메서드가 정의되어 있습니다.

  • 스택의 맨 위에서 값을 삭제하고 삭제된 값을 반환하는 'search_val'이라는 또 다른 메서드가 정의되어 있습니다.

  • '루트에 삽입', '왼쪽에 삽입', '오른쪽에 삽입' 및 '종료'와 같은 4가지 옵션이 제공됩니다.

  • 사용자의 입력/선택에 따라 각각의 동작이 수행됩니다.

  • 이 출력은 콘솔에 표시됩니다.