2011-03-20 10 views
1

이진 검색 트리를 반복적으로 복사하고 트리를 반환해야하는 문제에 대해 작업하고 있습니다. 나는 바이너리 검색 트리 클래스에서 코딩 중이므로, 그것이 호출되는 바이너리 검색 트리를 복사 할 것이다. 요구 사항에 따르면 개인 메서드의 반환 형식은 Entry<E>이고 형식은 Entry<E>이어야합니다. 내가 겪고있는 문제는 여러 항목이 트리에 추가되는 것입니다.자바 이진 검색 트리 재귀 복사 트리

protected static class Entry<E> { 
    protected E element; 
    protected Entry<E> left = null, 
         right = null, 
         parent; 
    protected int pos; 
protected Entry<E> link = null; 
public Entry() { } 
    public Entry (E element, Entry<E> parent) 
{ 
     this.element = element; 
     this.parent = parent; 
    } 
} 
+0

n00b - re : 제안 된 편집 : 다른 사람의 답변을 편집하는 대신 자신의 질문에 대한 답변을 게시 할 수 있습니다. –

답변

3
private Entry <E> rcopy(Entry <E> current){ 
    if(current.left!=null) return rcopy(current.left); 
    if(current.right!=null) return rcopy(current.right); 
    return current; 
} 

이 아무것도 복사하지 않습니다 : 여기에

내가 현재 가지고있는 것입니다 : 당신은 내가 나에게 가능한 것을 알 수 있도록 여기

public BinarySearchTree<E> rcopy(){ 
    BinarySearchTree newTree = new BinarySearchTree(); 
    newTree.add(rcopy(root).element); 
    return newTree; 
} 


private Entry <E> rcopy(Entry <E> current){ 
    if(current.left!=null) return rcopy(current.left); 
    if(current.right!=null) return rcopy(current.right); 
    return current; 
} 

을 그리고 엔트리 클래스입니다. 현재 노드의 맨 왼쪽 (left-most) (또는 가장 왼쪽 자식이 없으면 현재 또는 리프 노드 인 경우 현재)을 리턴합니다. 당신은 항상 현재를 돌려주기 때문입니다. 다음과 같은 모양이 필요합니다.

private Entry <E> rcopy(Entry <E> current){ 
    if (current == null) return null; 
    return new Entry <E> (current.element, rcopy(current.left), rcopy(current.right)); //write a constructor for that 
} 

실제로 노드를 복사하십시오. 나는 코드를 테스트하지 않았으며 조금 늦었다. 여전히 정확하길 바란다.

BinarySearchTree<E>Entry<E>을 구별하는 이유가 있습니까? 나무의 일부도 나무가 아닌가?

+0

내 강사가 찾고있는 코드가 아닌 코드가 작동하는 것처럼 보입니다. rcopy() 메서드 만 편집 할 수 있습니다. – jbeverid

+0

@ n00b : 따라서 노드에 대한 새 항목을 만들고 왼쪽 및 오른쪽 하위 트리에 대해 반복적으로 복사 한 다음 노드에 추가하십시오. 같은 원리이고,'rcopy' 메쏘드 안에서만 할 수 있습니다. –

+0

물론 우리는 당신에게 필요한 솔루션을 제공 할 수 있습니다.하지만 당신은 아무것도 배울 수 없습니다. 필요에 따라 샘플을 수정하십시오. 그리고 당신이 붙어 있다면 당신은 여전히 ​​다시 물어볼 수 있습니다. 아마 당신은이 기사를 읽고 싶습니다 : http://en.wikipedia.org/wiki/Tree_traversal – paztulio

0

방금 ​​내가 가진 해결책을 공유 할 것이라고 생각했습니다. 내 주요 문제는 개체에 대한 깊은 복사를 수행하지 않으므로 새 개체를 만드는 대신 개체를 참조하게됩니다.

public BinarySearchTree<E> rcopy(){ 
    BinarySearchTree<E> newTree = new BinarySearchTree<E>(); 
    newTree.root = rcopy(root); 
    newTree.size=newTree.nodes(); 
    return newTree; 
} 
private Entry <E> rcopy(Entry <E> current){ 
    Entry <E> b=new Entry<E>(); 
    if(current!=null){ 
     if(current.left!=null)b.left=rcopy(current.left); 
     if(current.right!=null)b.right=rcopy(current.right); 
     b.element = current.element; 
     b.parent = successor(current); 
    } 
    return b; 
} 

문제에 대한 도움말은 당신에게 모두 감사 (후임을 진행할 때 개체의 항목을 반환하는 방법입니다)!