私は再帰的な解決策はうまく動作すると思います。すべてのノードで、左右の子の重みを取得します。
- LとRの両方が知られている:あなたは、次の例を持っているノードが有効なのIFF L == R
- どちらもLであるか、Rが知られている:このノードが不明であり、二回のことを多重 を持っていますLとRの最大の多重度
- LまたはRのいずれかが不明です。このノードは、既知の子の の重みが、未知の子 の倍数で割り切れる場合に有効です。体重は既知の子供の体重の2倍です。
ここでのアイデアは、値が整数にすぎないので、未知の子供が特定のノードの下にあるかどうかを把握する必要があるということです。 1つのノードで、左の子が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
大きな方程式系を作りませんが、小さな方程式系を作り、解き、結果を記入して、次の副問題を探してください。 –