2014-05-25 2 views
1

중복이 포함되지 않도록 이진 트리를 구현하고 싶습니다. 여기에 내 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을 더합니다.

답변

1

솔루션 :

원래 코드에서 줄 return null;를 제거합니다.

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 node; 
} 

설명 : 모든 노드를 추가 한

, 당신이 나무는 다음과 같이보고했다 :

 5 
    4  6 
       60 
      25 
     10 

이것은 당신이 남아 있어야 코드입니다 귀하의 코드에 대한 하나의 문제는 중복을 직면 할 때 null을 반환한다는 것입니다. (노드 25에서 호출)이 코드

node.left = insert(node.left, x); 

는 다음의에게 즉이

node.left = null; 

를 얻을; 중복에 대해 null을 반환하면 기존 노드를 지 웁니다. 그리고 내가 볼 수있는 한, 새로운 것이 삽입되지 않습니다. 따라서 복제본의 경우 기존 노드를 삭제하면됩니다. 그러나 "Duplicates not allowed"이 인쇄됩니다.

그러나 return null;을 삭제하면 기존의 10 개 노드가있는 그대로 유지됩니다. 그리고 새로운 10은 무시 될 것입니다.

+0

"중복을 위해 null을 반환 할 때 기존 노드를 지울 때"의미하는 바를 설명해 주실 수 있습니까? 다시 10을 삽입하면 필자의 10이 사라집니다. 하지만 10을 다시 삽입 할 때 else 절의 조건 중 하나도 만족되지 않습니다. 왜냐하면 10 <10 and 10> 10은 사실이 아닙니다. 따라서 만족하는 유일한 것은 null 객체를 반환하도록 지시하는 else 절입니다. 그래서 이전의 노드는 아무 일도 일어나지 않을 것입니다. –

+0

네, 맞습니다.else 절은 사용되며'null '을 반환합니다. 그러나이 'null'은 어디로 돌아 갔습니까? 그것은 25 노드에서'node.left = insert (node.left, x);'로 리턴됩니다. 따라서 25 노드의 왼쪽 포인터는 null로 설정됩니다. 그래서, 당신은 정확합니다, 당신의 초기 10은 사라질 것입니다. 그러나 새로운 10은 절대로 삽입되지 않습니다. – Einar

+0

감사합니다. 마침내 왜 내 10 이전 버전이 사라 졌는지 이해합니다. 복제본이 입력되지 않도록하기 위해 내가 할 수있는 것을 설명해주십시오. "null을 반환하는 대신 새롭게 추가 된 노드를 반환합니다."새로운 BinaryNode를 복사하여 만들었고 다른 경우에는'copy = new BinaryNode (x); '라는 행을 삽입했습니다. 여전히 사본 10은 복제됩니다. –

0

내가 말할 수있는 한 다른 게시물은 정확하지만 몇 가지 변경 사항을 제안합니다.

우선 -이 라인

t.root=t.insert(t.root,5);

t.insert(5); 

빈 나무가 당신의 재귀 삽입의 첫 번째 반복에 null이됩니다되어야한다. 귀하의 생성자는 단지

BinaryTree t = new BinaryTree(); 

이어야하며 BinaryTree 클래스는 구성원 노드 변수가 루트 여야합니다.

관련 문제