【브러시 질문 일기】1022. 루트에서 잎까지 이진수의 합

계속 만들고 성장을 가속화하십시오! "너겟 데일리 뉴플랜 · 6월 업데이트 챌린지" 참여 4일차 입니다 . 이벤트 상세보기 클릭

이 쓰기 일기의 50 번째 기사 제목은 루트에서 잎까지 이진수의 합 , 단순

1. 주제 설명:

또 다른 이진 트리 질문입니다. 이진 트리에 대한 질문은 비교적 간단합니다. 이해만 하면 하기 쉽습니다.

2. 이 질문은 어떤 생각을 조사합니까? 당신의 생각은 무엇입니까?

제목은 비교적 명확합니다. 즉, 제목이 제공하는 이진 트리에서 루트 노드에서 각 리프 노드까지의 경로를 찾은 다음 모든 경로를 합산합니다.

약간의 차이점은 각 경로에 대해 계산을 위해 경로에 있는 노드를 101010의 이진 형식으로 조합해야 하며 특별한 것은 없다는 것입니다.

분석하다

여기에서 이진 트리의 순회가 필요하다는 것이 명백하므로 이진 트리를 재귀적으로 순회하는 3가지 방법이 있음을 알고 있습니다.

  • 선주문 순회 , 루트 노드 -> 왼쪽 노드 -> 오른쪽 노드
  • 순차 순회 , 왼쪽 노드 -> 루트 노드 -> 오른쪽 노드
  • 후위 순회 , 왼쪽 노드 -> 오른쪽 노드 -> 루트 노드

물론 어떤 순회 방법을 사용하든 다른 논리를 사용하여 문제에 필요한 경로를 조합할 수 있으므로 아무거나 선택 하고 후위 순회를 예로 들어 보겠습니다.

그림에서 주어진 이진 트리의 첫 번째 경로가 1,0,0 임을 알 수 있습니다.

그렇다면 이 3개의 노드를 어떻게 100 개로 조합할 수 있습니까?

사실 비교적 명확하다.

  • 첫 번째 노드로 이동할 때 val에 1 값이 할당됩니다.
  • 두 번째 노드로 이동할 때 val << 1 | 현재 노드의 값 == 10 | 0 == 10 --> val = 10
  • 마찬가지로 세 번째 노드로 이동할 때 val << 1 | 현재 노드의 값 == 100 | 0 == 100 --> val = 100 = 4

그러면 두 번째 도로를 횡단할 때도 마찬가지이며 101 = 5로 조립될 수도 있습니다.

그러면 결과를 계산할 때 전체 트리의 링크가 왼쪽 서브트리의 링크 + 오른쪽 서브트리 의 링크라고 생각하면 어렵지 않다.

그런 다음 sum(root) = sum(root.left) + sum(root.right)이 있습니다.

3. 코딩

위의 논리와 분석에 따르면 다음 코드로 변환할 수 있습니다.

코딩할 때 첫 번째 노드의 값이 val에 직접 할당될 수 있도록 순회를 시작할 때 첫 번째 노드를 순회할 때 기본값이 0이라는 점에 주의해야 합니다.

인코딩은 다음과 같습니다.

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func helpdfs(node *TreeNode, val int) int {
    if node == nil{
        return 0
    }
    val = val <<  1 | node.Val
    if node.Left == nil && node.Right == nil{
        return val
    }
    return helpdfs(node.Left, val) + helpdfs(node.Right, val)
}
func sumRootToLeaf(root *TreeNode) int {
    return helpdfs(root, 0)
}
复制代码

4. 요약:

이런 식으로 시간 복잡도는 O(n) 이고, n 개의 노드를 통과해야 하고 공간 복잡도도 O(n) 입니다. O(n)을 수동으로 열지 않더라도 여기에서는 놀라운 일이 아닙니다. 공간 이지만 재귀를 사용하는 경우 스택 공간을 소비해야 하므로 시간 복잡도도 O(n)

원래 제목 주소: 1022. 루트에서 잎까지 이진수의 합

나는 오늘 여기, 내가 배운 것, 편차가 있으면 나를 수정하십시오.

좋아요, 팔로우, 즐겨찾기에 오신 것을 환영합니다.

친구 여러분, 여러분의 지원과 격려는 제가 지속적으로 공유하고 품질을 향상시킬 수 있는 원동력입니다.

자, 이번에야말로

기술은 열려 있고 우리의 사고 방식은 열려 있어야 합니다. 변화를 수용하고 태양 아래에서 살아가며 앞으로 나아가십시오.

꼬마 악마소년 네자 입니다 좋아요 , 팔로우, 수집 환영합니다 다음에 또 만나요~

рекомендация

отjuejin.im/post/7103550735169617928
рекомендация