0
に条件を追加し、私は最終的に、私のBSTの作業とその機能を持って操作は:theTree.remove(key<=75);
と他の複数の方法で、私はそのようなことを行う構文が間違っていることを知っていますが、私はそれを行う方法についてオンラインで関連情報を見つけることはできないようです。どんな助言も役に立ちます。には、いくつかのBSTノードの削除
コード:
public class DatosTarea9 {
Node root;
public void addNode(int key, String name) {
Node newNode = new Node(key, name);
if(root == null) {
root = newNode;
}
else {
Node focusNode = root;
Node parent;
while(true) {
parent = focusNode;
if(key < focusNode.key) {
focusNode = focusNode.leftChild;
if(focusNode == null) {
parent.leftChild = newNode;
return;
}
}
else {
focusNode = focusNode.rightChild;
if(focusNode == null) {
parent.rightChild = newNode;
return;
}
}
}
}
}
public void inOrderTraverseTree(Node focusNode) {
if(focusNode != null){
inOrderTraverseTree(focusNode.leftChild);
System.out.println(focusNode);
inOrderTraverseTree(focusNode.rightChild);
}
}
public boolean remove(int key) {
Node focusNode = root;
Node parent = root;
boolean isItALeftChild = true;
while (focusNode.key != key){
parent = focusNode;
if(key < focusNode.key){
isItALeftChild = true;
focusNode = focusNode.leftChild;
}
else {
isItALeftChild = false;
focusNode = focusNode.rightChild;
}
if(focusNode == null)
return false;
}
if (focusNode.leftChild == null && focusNode.rightChild == null){
if(focusNode == root){
root = null;
}
else if(isItALeftChild){
parent.leftChild = null;
}
else {
parent.rightChild = null;
}
}
else if(focusNode.rightChild == null){
if(focusNode == root)
root = focusNode.leftChild;
else if(isItALeftChild)
parent.leftChild = focusNode.leftChild;
else parent.rightChild = focusNode.leftChild;
}
else if(focusNode.leftChild == null){
if(focusNode == root)
root = focusNode.rightChild;
else if(isItALeftChild)
parent.leftChild = focusNode.rightChild;
else
parent.rightChild = focusNode.leftChild;
}
else {
Node replacement = getReplacementNode(focusNode);
if(focusNode == root)
root = replacement;
else if (isItALeftChild)
parent.leftChild = replacement;
else
parent.rightChild = replacement;
replacement.leftChild = focusNode.leftChild;
}
return true;
}
public Node getReplacementNode(Node replacedNode){
Node replacementParent = replacedNode;
Node replacement = replacedNode;
Node focusNode = replacedNode.rightChild;
while (focusNode != null){
replacementParent = replacement;
replacement = focusNode;
focusNode = focusNode.leftChild;
}
if(replacement != replacedNode.rightChild){
replacementParent.leftChild = replacement.rightChild;
replacement.rightChild = replacedNode.rightChild;
}
return replacement;
}
public static void main(String[] args) {
DatosTarea9 theTree = new DatosTarea9();
theTree.addNode(82, "Jorge");
theTree.addNode(74, "Javier");
theTree.addNode(66, "Jose");
theTree.addNode(38, "Jaime");
theTree.addNode(94, "Andres");
theTree.addNode(88, "Alejandro");
theTree.addNode(42, "Adrian");
theTree.addNode(79, "Alan");
System.out.println("Remove all keys below 75");
theTree.remove(key<=75);
theTree.inOrderTraverseTree(theTree.root);
}
}
class Node {
int key;
String name;
Node leftChild;
Node rightChild;
Node(int key, String name) {
this.key = key;
this.name = name;
}
public String toString(){
return name + " has a key " + key;
}
}
ヘルパー 'removeWithCondition()'を追加し、比較関数または述語関数を渡すことができます。 – ChiefTwoPencils
返答ありがとうございます。私は 'removeWithCondition()'に関するドキュメントを見つけることができませんでした。どうすれば実装できますか – Dotol
なぜドキュメンテーションが見つかりましたか?さらに、条件を満たすすべてのノードを削除する唯一の方法は、inOrderTraversalを実行して同時に削除することです –