2012-10-18 4 views
0

java에서 "first child next sibling"트리에 대한 클래스를 구현했습니다.첫 번째 자식 다음 형제 트리 복사

는 다음과 같은 트리를 나타내는 링크입니다

나는 다음과 같은 기능을 구현 한 http://www.cs.utexas.edu/~novak/cs315116.html

:

addChild(); 
getLabel(); 
setLabel(T v); 
getParent(); 
getNextSibling(); 
getFirstChild(); 

내하는 AddChild 기능은 다음과 같은 순서로 아이들을 추가합니다.

public void addChild(Tree<T> c) { 
    c.parent = this; 
    if (firstChild == null) 
     firstChild = c; 
    else { 
     c.nextSibling = firstChild; 
     firstChild = c; 
     } 
} 

That is, if we have a tree node 1 and we add tree node 2 and then tree node 3 to it then the final tree would be, 
1.addChild(2); 
1.addChild(3); 

1           1 
/\ which is internally stored as  /
3 2          3 - 2 
The most recent child added would be the first child 

이러한 트리를 인수로 제공하면 트리 복사본을 만들어 반환하는 CopyTree 기능을 구현하고 싶습니다. 몇 가지 초기 코드가 있지만 올바른 재귀를 얻을 수 없습니다.

private Tree<String> CopyTree(Tree<String> tr){ 
if (tr == null) 
    return null; 
Tree<String> t = new Tree<String>(); 
t.setLabel(tr.getLabel()); 
if (tr.getFirstChild() != null) { 
    t.addChild(CopyTree(tr.getFirstChild())); 
} 
Tree<String> temp = tr.left(); 

if (temp != null) { 
while (temp.getNextSibling() != null) { 
    t.addChild(CopyTree(temp.getNextSibling())); 
    temp = temp.getNextSibling(); 
} 
} 
return t; 
} 

재귀 작업을 수행하기 위해해야 ​​할 일은 무엇입니까 ?? 사전에 모든

답변

0

는 ..을 얻었다

private Tree<String> CopyTree(Tree<String> tr){ 
if (tr == null) 
    return null; 
Tree<String> t = new Tree<String>(); 
t.setLabel(tr.getLabel()); 

Tree<String> temp = tr.left(); 

if (temp != null) { 
    ArrayList<Tree<String>> list = new ArrayList<>(); 
    while (temp.getNextSibling() != null) { 
    list.add(temp.getNextSibling()); 
    //t.addChild(CopyTree(temp.getNextSibling())); 
    temp = temp.getNextSibling(); 
} 
for (int i = (list.size()-1); i>=0; i--) { 
    t.addChild(CopyTree(list.get(i))); 
} 

} 
if (tr.left() != null) { 
    t.addChild(CopyTree(tr.left())); 
} 

return t; 
} 
0

최초의

덕분에, 나는 당신이 여기에 오류가 생각 :

while (temp.getNextSibling() != null) { 
    t.addChild(CopyTree(temp.getNextSibling())); 
    temp = temp.getNextSibling(); 
} 

getNextSibling()가 오른쪽으로 다음 아이를 retuns 만하는 AddChild은()에서 어린이를 삽입하기 때문에 왼쪽, 주문을 취소하고 있습니다. 이것은 괜찮을 수도 있지만 이것을 피하십시오.

귀하의 질문에 대답하기 위해, 귀하의 재귀 함수는 새 트리의 각 노드에 대한 메소드로 호출해야하며 이전 트리의 해당 노드를 인수로 수신해야합니다. 그런 다음이 노드의 자식을 새 노드의 이전 트리에서 복사해야하며이 작업을 수행하는 동안 이러한 각 자식에 대해 재귀 함수를 호출해야합니다.

관련 문제