삭제 알고리즘에 문제가있는 것을 찾을 수 없습니다. BST의 루트에서 delete 메소드를 실행하면 루트가 하위 트리의 최소값으로 바뀌지 만 이후에는 노드가 삭제되지 않습니다.Java의 이진 검색 트리에서 삭제
public void delete(BinaryTreeNode node, int x){
if (node==null)
return;
else if (x<node.getKey())
delete(node.getLeftChild(),x);
else if (x>node.getKey())
delete(node.getRightChild(),x);
else{
if (node.getLeftChild()==null)
node = node.getRightChild();
else if (node.getRightChild()==null)
node = node.getLeftChild();
else{
BinaryTreeNode temp = findMin(node.getRightChild());
System.out.println(temp.getKey() + " " + node.getKey());
node.setKey(temp.getKey());
System.out.println(temp.getKey() + " " + node.getKey());
delete(node.getRightChild(), node.getKey());
}
}
}
내 findMin() 메소드
public BinaryTreeNode findMin(BinaryTreeNode node){
if (node.getLeftChild()==null)
return node;
else
return findMin(node.getLeftChild());
}
(4)의 루트로 모든 정수 1-9 함유 BST 들어 inorderPrint() 내 출력
1,2,3,5,5,6,7,8,9
수득
1,2,3,5,6,7,8,9
당신의'findMin (...)'방법을 수행 반복적으로 대신 재귀. 아무 관련이 없습니다 –
@CyberneticTwerkGuruOrc을 문제가 생기면 이것이 꼬리 재귀이기 때문에 어쨌든 대부분의 컴파일러에 의해 최적화됩니다. 이 경우 재귀 적 솔루션을 더 읽기 쉽다고 생각합니다. – amit
@amit 분명히 문제와 관련이 없습니다. 그래서 대답 대신 댓글로 게시했습니다. 이 경우 컴파일러가 처리하더라도 OP는 재귀 적으로 반복적으로 * 대부분의 * 메소드를 수행하는 방법을 배워야합니다 (재귀를 연구하지 않는 한). –