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

Python에서 주어진 이진 트리에 연결 목록이 있는지 확인하는 프로그램

<시간/>

루트 노드 '루트'가 있는 이진 트리와 헤드 노드 '헤드'가 있는 연결 목록이 있다고 가정합니다. 우리는 그 연결 리스트가 그 바이너리 트리에 존재하는지 알아내야 합니다. 트리의 노드 집합이 연결 목록으로 순서대로 서로 연결되어 있고 그 순서가 제공된 연결 목록과 비슷하면 'True'를 반환하고 그렇지 않으면 'False'를 반환합니다.

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

Python에서 주어진 이진 트리에 연결 목록이 있는지 확인하는 프로그램

트리

Python에서 주어진 이진 트리에 연결 목록이 있는지 확인하는 프로그램

연결 목록

그러면 출력이 True가 됩니다.

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

  • arr :=새 목록
  • 크기 :=arr의 크기
  • temp_arr :=-1로 초기화된 크기(크기 + 1)의 배열
  • helper() 함수를 정의합니다. 이것은 뿌리를 내릴 것입니다, val
    • val>=크기이면
      • 참 반환
    • 루트가 None과 유사하면
      • 거짓을 반환
    • val :=val + 1
    • val> 0이고 root의 값이 arr[val - 1]과 같지 않으면 do
      • val :=temp_arr[val - 1] + 1
    • helper(루트의 왼쪽, val) 또는 도우미(루트의 오른쪽, val)가 True이면
      • 참 반환
    • 거짓을 반환
  • 시작:=머리
  • 시작이 null과 같지 않은 동안 do
    • arr 끝에 start 값 추가
    • start :=다음 시작
  • 범위 1에서 크기 + 1까지의 노드에 대해
    • temp_arr[노드] :=temp_arr[노드 - 1] + 1
    • temp_arr[node]> 0 및 arr[node - 1]이 arr[temp_arr[node] - 1]과 같지 않은 동안 do
      • temp_arr[노드] :=temp_arr[temp_arr[노드] - 1] + 1
  • 반환 도우미(루트, 0)

예시

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

class TreeNode:def __init__(self, val, left=None, right=None):self.val =val self.left =left self.right =rightclass ListNode:def __init__(self, val, next=None) :self.val =val self.next =nextdef insert(temp,data):que =[] que.append(temp) while (len(que)):temp =que[0] que.pop(0) if ( not temp.left):데이터가 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):node =TreeNode(elements[0]) for element[1:]의 요소:insert(node, element) return nodedef make_list(elements):element[1:]의 요소에 대한 head =ListNode(elements[0]):ptr =head 동안 ptr.next:ptr =p tr.next ptr.next =ListNode(요소) return headdef solve(루트, 헤드):arr =[] start =시작하는 동안 헤드:arr +=(start.val,) start =start.next 크기 =len(arr) temp_arr =[-1] * (크기 + 1) 범위의 노드(1, 크기 + 1):temp_arr[노드] =temp_arr[노드 - 1] + 1 동안 temp_arr[노드]> 0 및 arr[노드 - 1 ] !=arr[temp_arr[노드] - 1]:temp_arr[노드] =temp_arr[temp_arr[노드] - 1] + 1 def helper(root, val):val>=크기인 경우:반환 루트가 아닌 경우 True:반환 거짓 val +=1 동안 val> 0 및 root.val !=arr[val - 1]:val =temp_arr[val - 1] + 1 if helper(root.left, val) 또는 helper(root.right, val) :반환 True 반환 False 반환 도우미(root, 0)root =make_tree([6, 7, 8, 9, 10])head =make_list([6, 7, 10])print(solve(root, head)) 

입력

루트 ​​=make_tree([6, 7, 8, 9, 10])head =make_list([6, 7, 10])print(해결(루트, 헤드))

출력

사실