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

Python의 주어진 이진 트리에서 가장 큰 완벽한 하위 트리 찾기


주어진 이진 트리가 있다고 가정합니다. 주어진 이진 트리에서 가장 큰 Perfect 하위 트리의 크기를 찾아야 합니다. 우리가 알고 있듯이 완벽한 이진 트리는 모든 내부 노드가 두 개의 자식을 갖고 모든 잎이 동일한 수준에 있는 이진 트리입니다.

따라서 입력이 다음과 같으면

Python의 주어진 이진 트리에서 가장 큰 완벽한 하위 트리 찾기

그러면 출력은 3이고 하위 트리는

Python의 주어진 이진 트리에서 가장 큰 완벽한 하위 트리 찾기

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

  • RetType이라고 하는 하나의 블록을 정의합니다. 이것은 isPerfect, height 및 rootTree를 보유하며 초기에는 모두 0입니다.

  • get_prefect_subtree()라는 함수를 정의하면 루트가 됩니다.

  • r_type :=새로운 RetType

  • 루트가 None과 같으면

    • r_type.isPerfect :=참

    • r_type.height :=0

    • r_type.rootTree :=null

    • 반환 r_type

  • left_subtree :=get_prefect_subtree(root.left)

  • right_subtree :=get_prefect_subtree(root.right)

  • left_subtree가 완벽하고 right_subtree가 완벽하고 left_subtree의 높이가 right_subtree의 높이와 같으면

    • r_type의 높이 :=left_subtree의 높이 + 1

    • set r_type은 완벽합니다.

    • r_type.rootTree :=루트

    • 반환 r_type

  • set r_type이 완벽하지 않습니다.

  • r_type.height :=left_subtree의 최대 높이, right_subtree의 높이

  • left_subtree의 높이> right_subtree의 높이인 경우

    • r_type.rootTree :=left_subtree.rootTree

  • 그렇지 않으면

    • r_type.rootTree :=right_subtree.rootTree

  • 반환 r_type

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

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 is not None:
      print_tree(root.left)
      print(root.data, end = ', ')
      print_tree(root.right)
class RetType:
   def __init__(self):
      isPerfect = 0
      height = 0
      rootTree = 0
def get_prefect_subtree(root):
   r_type = RetType()
   if (root == None) :
      r_type.isPerfect = True
      r_type.height = 0
      r_type.rootTree = None
      return r_type
   left_subtree = get_prefect_subtree(root.left)
   right_subtree = get_prefect_subtree(root.right)
   if (left_subtree.isPerfect and right_subtree.isPerfect and left_subtree.height == right_subtree.height) :
      r_type.height = left_subtree.height + 1
      r_type.isPerfect = True
      r_type.rootTree = root
      return r_type
   r_type.isPerfect = False
   r_type.height = max(left_subtree.height, right_subtree.height)
   if (left_subtree.height > right_subtree.height ):
      r_type.rootTree = left_subtree.rootTree
   else :
      r_type.rootTree = right_subtree.rootTree
   return r_type

root = TreeNode(2)
root.left = TreeNode(3)
root.right = TreeNode(4)
root.left.left = TreeNode(5)
root.left.right = TreeNode(6)
root.right.left = TreeNode(7)

res = get_prefect_subtree(root)
h = res.height

print ("Size: " , pow(2, h) - 1)
print ("Tree: ", end = " ")
print_tree(res.rootTree)

입력

root = TreeNode(2)
root.left = TreeNode(3)
root.right = TreeNode(4)
root.left.left = TreeNode(5)
root.left.right = TreeNode(6)
root.right.left = TreeNode(7)

출력

Size: 3
Tree: 5, 3, 6,