は、あなたがルートフィールドを交換する必要がある、または親ノードのleftChild
かrightChild
のどちらかになるので、ツリーを下に移動する必要があります。
leftChild
とrightChild
がヌルでないノードを削除するには、ノードを左のサブツリーの最も右のノードまたは右のサブツリーの一番左のノードに置き換えることができます。この例では
は、私が(Tree
?)メソッドがクラスであることを前提としていNode
フィールドはroot
と呼ばれ、Node
sがComparable
あるフィールドvalue
を持っているしていること:
public void remove(Node focus) {
root = removeHelper(root, focus);
}
public static Node removeHelper(Node root, Node focus) {
if (root == null) {
return null;
} else if (root == focus) {
if (focus.leftChild == null) {
return focus.rightChild;
} else if (focus.rightChild == null) {
return focus.leftChild;
} else {
Node node = removeLeftMostOfRight(focus);
node.leftChild = focus.leftChild;
node.rightChild = focus.rightChild;
return node;
}
} else {
int r = focus.value.compareTo(root.value);
if (r < 0) {
root.leftChild = removeHelper(root.leftChild, focus);
} else {
root.rightChild = removeHelper(root.rightChild, focus);
}
return root;
}
}
private static Node removeLeftMostOfRight(Node focus) {
Node node = focus.rightChild;
if (node.leftChild == null) {
focus.rightChild = node.rightChild;
} else {
Node prev;
do {
prev = node;
node = node.leftChild;
} while (node.leftChild != null);
prev.leftChild = node.rightChild;
}
return node;
}
C/C++のような言語では、バイナリツリーをはるかに簡単かつ効率的に実装できるポインタへのポインタを持つことができます。
これは乱雑になる可能性があります。削除するノードがツリーの先頭である場合はどうなりますか?おそらく、ここであなたのツリーの再バランス/再構成をどのようにしたいかについていくつかの仮定をしなければなりません。 –
ノードを削除した後にツリーのバランスをとるための別の方法が必要ですか? – karthi97
別の方法が必要かどうかはあなた次第ですが、ここでは構造的な変更があると思います。 –