두 갈래 트리 문제 - 두 갈래 트리에서 지정한 값의 최대 경로 길이를 누적 찾습니다.

[제목]
두 갈래 나무의 머리 노드 헤드와 32비트 정수sum를 정하고, 두 갈래 나무의 절점 값 유형은 정형이며, 누적과sum의 최장 경로 길이를 구한다.경로란 한 노드에서 아래로 내려가 매번 최대 한 아이의 노드를 선택하거나 구성된 노드 체인을 선택하지 않는 것을 말한다.
[기본적인 사고방식]
  • 해시표맵을 생성하는데 맵의 역할은 헤드에서 시작된 경로의 누적과 합을 기록하는 것이다. 그 중에서 키값은 특정한 누적과 합을 나타내고value는 누적과 출현한 최초의 층수를 나타낸다.예를 들어 어떤 경로의 노드 값이 [1,2,3,-3,5]라고 가정하면 맵의 기록은 [1:1,3:2,6:3,3:2,8:5]이다. 주의value는 누적과 출현의 최초 층수를 나타내기 때문에 맵의 네 번째 기록은 두 번째 기록과 같기 때문에 네 번째 기록은 사실 삽입할 필요가 없다. 맵의 기록은 [1:1,3:2,6:3,8:5]이다
  • 맵에 (0,0) 기록을 추가하면 누적과 0은 어떤 노드도 사용하지 않아도 얻을 수 있음을 나타낸다.먼저 두 갈래 트리를 훑어보고 현재 위치가cur이고 층수는level이라고 가정하면 이때의 누적과cur의 부모 노드의 누적과presum에cur 노드의 값을 더한다. 즉cursum=presum+cur이다.val.만약 (presum +cur.val, level) 이 기록이 맵에 존재한다면, 다시 삽입할 필요가 없습니다.다음에 우리가 해야 할 일은cur로 끝나는 경로의 누적과 제목이 지정한 값sum가 있는지 판단하는 것이다.맵에서cursum-sum이 있는지 확인하면 됩니다. 이 기록이 존재하면 level-map[cursum-sum]은 조건을 충족시키는 경로 길이입니다. 전역 변수를 사용하여 경로의 최대치를 업데이트합니다
  • 주의해야 할 것은 두 갈래 나무를 두루 지나간 하위 나무가cur의 부모 노드로 되돌아가려면map에서 이 노드의 기록을 삭제해야 한다는 것이다. 그렇지 않으면 경로가 위에서 아래로 내려가지 않을 수도 있다

  • 다음은python3.5로 이루어진 코드입니다.
    def getMaxLength(root, K):
        def getLengthByPreOrder(root, K, preSum, level, length, map):
            if not root:
                return length
            curSum = preSum + int(root.val)
            if curSum not in map:
                map[curSum] = level
            if curSum-K in map:
                length = max(level - map.get(curSum-K), length)
            length = getLengthByPreOrder(root.left, K, curSum, level+1, length, map)
            length = getLengthByPreOrder(root.right, K, curSum, level+1, length, map)
            if level == map.get(curSum):
                map.pop(curSum)
            return length
    
    
        if not root:
            return
        map = {}
        map[0] = 0
        return getLengthByPreOrder(root, K, 0, 1, 0, map)
    

    좋은 웹페이지 즐겨찾기