KdTree をゼロから実装しようとしています。add-、最近傍の検索、range メソッドでのノードの検索を正常に実装したので、ノードの削除に行き詰まっています。
ウィキペディアに記載されている方法はあいまいで、役に立たないものです。代わりに、これらのスライドを出発点として使用しています。しかし、スライド 13 の remove メソッドの説明は私を混乱させます。
KDNode remove ( KDNode t , Point p , int cd ) {
if ( t == null ) return null;
else if (p.cd < t.data) t.left = remove (t.left , p , cd +1);
else if (p.cd > t.data) t.right = remove (t.right , p , cd +1);
else {
if (t.right == null && t.left == null ) return null ;
if (t.right != null )
t.data = findmin(t.right , cd , cd +1);
else {
t.data = findmin (t.left , cd , cd +1);
t.left = null;
}
t.right = remove (t.right , t . data , cd +1);
return t ;
}}
とを置き換えt.left
ても意味がありません。null
t.right with remove(t.right, ...)
これは正しいですか。また、この方法には他に何か問題がありますか? これらのスライドで説明した方法とは逆に、右側ではなく左側に等しいノードを配置していることに注意してください。メソッドはまだ有効ですか?