재귀적인 솔루션은 잘 작동한다고 생각합니다. 모든 노드에서 왼쪽과 오른쪽 자식의 무게를 얻습니다.
- L과 R 모두 알려져있다 : 다음과 같은 경우이 노드가 유효 IFF의 L == R
- 어느 L 또는 R이 알려져있다 :이 노드를 알 수없는 두 배의 그 다양성 있다 L과 R의 최대 다중도
- L 또는 R 중 하나만 알 수 있습니다.이 노드는 알려진 자식의 가중치가 알 수없는 자식의 배수로 나눌 수있는 경우 유효합니다. 무게는 알려진 아동의 두 배입니다.
여기서 아이디어는 값이 정수일 수 있기 때문에 알 수없는 자식 노드가 특정 노드 아래에 있는지 추적해야한다는 것입니다. 한 노드에서 왼쪽 자식이 4 개의 알 수없는 노드를 갖고 있고 그 오른쪽에 1 개의 알 수없는 노드가 있어도 1 개의 알 수는 4의 배수 여야하므로이 노드의 다중성은 8이어야하기 때문에 다중성은 항상 두 배가됩니다.
참고 : 여기서 다중성이라는 단어를 사용하고 있으며 실제로는별로 좋지 않지만 사용할 좋은 단어는 생각할 수 없습니다. 당신은 항상 코드 블록에 트리를 그리는 시도 할 수
package main
import (
"fmt"
)
// Assume that (Left == nil) == (Right == nil)
type Tree struct {
Val int
Left, Right *Tree
}
func (t *Tree) GetWeight() (weight int, valid bool) {
if t.Left == nil {
return t.Val, true
}
l, lv := t.Left.GetWeight()
r, rv := t.Right.GetWeight()
if !lv || !rv {
return 0, false
}
if l < 0 && r < 0 {
if l < r {
return 2 * l, true
}
return 2 * r, true
}
if l < 0 {
return 2 * r, r%(-l) == 0
}
if r < 0 {
return 2 * l, l%(-r) == 0
}
return r + l, r == l
}
func main() {
t := Tree{0,
&Tree{0,
&Tree{0,
&Tree{Val: 5},
&Tree{Val: -1},
},
&Tree{Val: 10},
},
&Tree{0,
&Tree{Val: -1},
&Tree{Val: -1},
},
}
w, v := t.GetWeight()
fmt.Printf("%d, %t\n", w, v)
t = Tree{0,
&Tree{0,
&Tree{0,
&Tree{Val: -1},
&Tree{Val: -1},
},
&Tree{Val: 5},
},
&Tree{Val: -1},
}
w, v = t.GetWeight()
fmt.Printf("%d, %t\n", w, v)
}
: 여기
은 이동에, 즉 당신의 예에서이 솔루션을 보여줍니다 코드 | – Alexander
하나의 커다란 방정식 시스템을 생성하지 않고, 작은 방정식을 생성하고 해결 한 다음 결과를 채우고 다음 하위 문제를 검색하십시오. –