質問
あると思いますが、どのように約方法を教えてください削除ンセのお父様(お義母様とは離婚のノード(ルート)?出来ない呼び削除するばかりの子どもnullの場合、今の子どもたちが子どもに移動すか?のように、まだ初期化としてnull??またはきたいポイント子どものでしょう。
解決
伝統的なバイナリ検索ツリー、撤去のノードできなくな影響により多くの子どもたちのノード:
- ノードのない子どもできるだけ簡単に除去
- ノード一子の引き抜くことができますが、のノードに置き換えられるだけ。これかどうかにかかわらず子どもは左または右ます。
- ノードを子供と二人には少し複雑なルールに関連付けます:をみつけなくてはなりませんの する承継 または るための前身である ノードの削除され、現在のノードの値とsucessorは、前身の価値が、その後削除承継または前身となっている(これらの規則)
他のヒント
は、この宿題ですか?それと間違って何も...私たちは、人々が彼らに答えを言うのではなく、学ぶのを助けるのが好きない。
あなたはちょうどあなたがお子様の子供についての情報を失うnullに子ノードを設定した場合。
標準木のクラスは、通常、配列またはコレクションで立ち往生し、その子を知っているだろう - バイナリツリーの場合には、次の2つの直接の子だけを持っているので、固定サイズの配列が動作します。そのため、彼らは通常、子供は子供のそのリストから削除されますへの呼び出し「removeMe」方法のいくつかの並べ替えを実装します。
前述のように削除している子供が子供を持っている場合は、、これは複雑になる。
ティムの答えは最高のようです。しかし、はい、あなたはそれがあなたの削除された子の種類に応じて、3つのうちのいずれかを実行したいと思うでしょう。あなたは子供がnullにする場合は、それらへの参照を失ってしまったので、それの子供たちが上に移動しません。代わりに、あなたは子供の左または右の子供があなたの削除かどうかを判断したいと思う子供あなたが削除を指すポインタに設定する必要があります。あなたは以前に設定した後、ノードあなたが削除の子に(左または右)ポインタを(左または右)ノード、あなたは文句を言わない、もはやそのノードへの参照を持っている、(あなたができるヌルに設定する必要はありませんがtheresのように」トンへのアクセス、それはもう。あなたは、古典的なBSTはありません、その場合には二重にリンクされたBSTのいくつかの並べ替えを、)書いていない限り、
このコードはあなたを助ける必要があります。
public Node<T> getParentOf(Node<T> child){
findParentOf(this.root, child);
return temp;
}
private void findParentOf(Node<T> ROOT, Node<T> child){
if(ROOT.hasLeft()){
findParentOf(ROOT.left, child);
}
if(ROOT.left == child || root.right == child){
temp = ROOT;
}
if(ROOT.hasRight()){
findParentOf(ROOT.right, child);
}
}
private void replaceNode(Node<T> original, Node<T> newNode){
Node<T> tempParent = getParentOf(original);
if(original == tempParent.left){
tempParent.left = newNode;
}else if(original == tempParent.right){
tempParent.right = newNode;
}
}
private void traverseChildrenAndAdd(Node<T> newParent, Node<T> oldParent){
newParent.insert(oldParent.data);
if(oldParent.hasLeft()){
traverseChildrenAndAdd(newParent,oldParent.left);
}
if(oldParent.hasRight()){
traverseChildrenAndAdd(newParent,oldParent.right);
}
}
private void deleteNode(Node<T> ROOT, Node<T> d){
if(d.data.compareTo(ROOT.data) < 0){
deleteNode(ROOT.left, d);
}else if(d.data.compareTo(ROOT.data) > 0){
deleteNode(ROOT.right, d);
}else if(d == this.root){
if(this.root.hasLeft()){
traverseChildrenAndAdd(root.left, root.right);
root = root.left;
}else if(root.hasRight()){
root = root.right;
}else{
root = null;
}
}else{
if(ROOT.hasLeft()&&ROOT.hasRight()){
Node<T> successor = getMinNode(ROOT);
replaceNode(successor, successor.right);
}else if(ROOT.hasLeft() || ROOT.hasRight()){
if(ROOT.hasLeft()){
replaceNode(ROOT, ROOT.left);
}else{
replaceNode(ROOT, ROOT.right);
}
}else{
replaceNode(ROOT, null);
}
}
}
public void remove(T data){
deleteNode(this.root, new Node<T>(data));
}
あなたは、この(擬似コード)のような何かを行うことができます:
を削除するには、ツリーの「ルート」とノードのルートまたは一部のデータを考えると、「x」は次の操作を行います。
if x < root
recurse to left child
if x > root
recurse to right child
else //node found
find the min item of the node right child //min item should be left most leaf node node
replace the value of the node you want to delete with min nodes value
now delete the min node
return root;
コード:
delete(Node root, Object x){
if(root == null){
return null;
}
if(data < root.data){
root = delete(root.left);
}else if(root.data < data){
root = delete(root.right);
}else{
if(root.left != null && root.right != null){
Object tmp = findMin(root.right);
root.data = tmp;
root.right = delete(root.right, tmp);
}else{
return (root.left != null) ? root.left : root.right;
}
}
return root;
}