루트 노드 '루트'가 있는 이진 트리와 헤드 노드 '헤드'가 있는 연결 목록이 있다고 가정합니다. 우리는 그 연결 리스트가 그 바이너리 트리에 존재하는지 알아내야 합니다. 트리의 노드 집합이 연결 목록으로 순서대로 서로 연결되어 있고 그 순서가 제공된 연결 목록과 비슷하면 'True'를 반환하고 그렇지 않으면 'False'를 반환합니다.
따라서 입력이 다음과 같으면
트리
연결 목록
그러면 출력이 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이면
- 참 반환
- 거짓을 반환
- val>=크기이면
- 시작:=머리
- 시작이 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(해결(루트, 헤드))출력
사실