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

파이썬에서 합이 k인 경로의 수를 세는 프로그램

<시간/>

이진 트리와 다른 값 k가 있다고 가정하고 하위 자식 경로에 대한 고유한 노드의 수를 찾아야 하며 합계는 k입니다.

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

파이썬에서 합이 k인 경로의 수를 세는 프로그램

k =5이면 경로가 [2, 3] 및 [1, 4]

이므로 출력은 2가 됩니다.

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

  • count :=지도는 처음에 키 0에 대해 값 1을 보유합니다.
  • ans :=0, 접두사 :=0
  • dfs() 함수를 정의합니다. 노드가 필요합니다.
  • 노드가 null이 아니면
    • 접두사 :=접두사 + 노드 값
    • ans :=ans + (count[prefix - target], 사용할 수 없는 경우 0이 됨)
    • 개수[접두사] :=개수[접두사] + 1
    • dfs(노드 왼쪽)
    • dfs(노드 오른쪽)
    • 개수[접두사] :=개수[접두사] - 1
    • 접두사 :=접두사 - 노드 값
  • 기본 방법에서 다음을 수행합니다.
  • dfs(루트)
  • 반환

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

예시

from collections import Counterclass TreeNode:def __init__(self, data, left =None, right =None):self.val =data self.left =left self.right =rightclass 솔루션:def solve(self, root, target ):count =Counter([0]) ans =prefix =0 def dfs(node):nonlocal ans, prefix if node:prefix +=node.val ans +=count[prefix - target] count[prefix] +=1 dfs(node.left) dfs(node.right) count[접두사] -=1 접두사 -=node.val dfs(root) return ans ob =Solution()root =TreeNode(3)root.left =TreeNode(2) root.right =TreeNode(4)root.right.left =TreeNode(1)root.right.left.right =TreeNode(2)k =5print(ob.solve(root, k))

입력

루트 =TreeNode(3)root.left =TreeNode(2)root.right =TreeNode(4)root.right.left =TreeNode(1)root.right.left.right =TreeNode(2)5 

출력

2