중복이 포함되지 않도록 이진 트리를 구현하고 싶습니다. 여기에 내 insert() 메소드가있다. 이진 검색 트리에 중복 인쇄가 발생했습니다.
public BinaryNode insert(BinaryNode node, int x) {
if (node == null) {
node = new BinaryNode(x);
} else if (x < node.element) {
node.left = insert(node.left, x);
} else if (node.element < x) {
node.right = insert(node.right, x);
} else {
System.out.println("Duplicates not allowed");
return null;
}
return node;
}
public static void main (String args[]) {
BinaryTree t = new BinaryTree();
t.root=t.insert(t.root, 5);
t.insert(t.root, 6);
t.insert(t.root, 4);
t.insert(t.root, 60);
t.insert(t.root, 25);
t.insert(t.root, 10);
t.insert(t.root, 10);
왜이 이진 트리에 인쇄되는 중복 (10)이다. 나는 else 문에서
return null
이 중복이 발견되었을 때 재귀를 멈추게한다고 생각했다. 10을 다시 넣으면 "Duplicates not allowed"이 인쇄되지만 거기에서 멈추지 않고 두 번째 시간에 10을 더합니다.
"중복을 위해 null을 반환 할 때 기존 노드를 지울 때"의미하는 바를 설명해 주실 수 있습니까? 다시 10을 삽입하면 필자의 10이 사라집니다. 하지만 10을 다시 삽입 할 때 else 절의 조건 중 하나도 만족되지 않습니다. 왜냐하면 10 <10 and 10> 10은 사실이 아닙니다. 따라서 만족하는 유일한 것은 null 객체를 반환하도록 지시하는 else 절입니다. 그래서 이전의 노드는 아무 일도 일어나지 않을 것입니다. –
네, 맞습니다.else 절은 사용되며'null '을 반환합니다. 그러나이 'null'은 어디로 돌아 갔습니까? 그것은 25 노드에서'node.left = insert (node.left, x);'로 리턴됩니다. 따라서 25 노드의 왼쪽 포인터는 null로 설정됩니다. 그래서, 당신은 정확합니다, 당신의 초기 10은 사라질 것입니다. 그러나 새로운 10은 절대로 삽입되지 않습니다. – Einar
감사합니다. 마침내 왜 내 10 이전 버전이 사라 졌는지 이해합니다. 복제본이 입력되지 않도록하기 위해 내가 할 수있는 것을 설명해주십시오. "null을 반환하는 대신 새롭게 추가 된 노드를 반환합니다."새로운 BinaryNode를 복사하여 만들었고 다른 경우에는'copy = new BinaryNode (x); '라는 행을 삽입했습니다. 여전히 사본 10은 복제됩니다. –