2014-02-18 4 views
1

그래서 그래픽으로 표현하고 싶은 사용자 정의 이진 트리 클래스가 있습니다. JTree가 가장 좋은 옵션 인 것 같습니다. 내 클래스는 현재 위치에 대한 참조를 가지므로 사용자가 트래버스를 더 쉽게하고 내부 Node 클래스를 추상화 할 수 있습니다. 다음이 호출되면 노드의 값을 탐색하여 반환합니다.이진 트리 그래픽 표현 문제

대부분이 트리를 함께 사용할 수 있지만 사용자가 노드를 추가하면 문제가 발생합니다. 나는 그들이 왼쪽 선택이나 올바른 선택을 추가 할 수 있도록 설정했습니다. 이것은 유지해야 할 데이터와 관련이 있으므로이 방법이 될 필요가 있습니다. 그리고 저는이 작업을 수행하는 방법에 전적으로 매달 렸습니다. 제가 구현 한 방법은 현재 동기화를 회복하기 위해 종료하고 재 초기화 할 필요가있을 때까지 나무를 비동기식으로 동기화 해제합니다.

일부 정보 :

- 여기, dTree 내 나무 클래스의 객체이며, gTree는 JTree에 개체 (데이터 트리, 그래픽 트리입니다 여기

내가 문제가있어 방법이 있습니다)

- getShortName (String) 메소드는 dTree 객체에서 외삽 된 JTree의 현재 노드를 나타내는 데 사용 된 정규화 된 이름을 반환합니다.

//Adds a new right node to the currently selected node. 
public void addNextR() 
{ 
    if(!dTree.hasNextR()) 
    { 
     dTree.addNextChoiceR("Empty Node"); 
     DefaultMutableTreeNode node = 
     ((DefaultMutableTreeNode)gTree.getSelectionPath().getLastPathComponent()); 
     node.add(new DefaultMutableTreeNode(getShortName(dTree.getCurrent()))); 
     expandTree(); 
    } 
} 

//Adds a new left node to the currently selected node. 
public void addNextL() 
{ 
    if(!dTree.hasNextL()) 
    { 
     dTree.addNextChoiceL("Empty Node"); 
     DefaultMutableTreeNode node = 
     ((DefaultMutableTreeNode)gTree.getSelectionPath().getLastPathComponent()); 
     node.add(new DefaultMutableTreeNode(getShortName(dTree.getCurrent()))); 
     expandTree(); 
    } 
} 

누구든지이 문제를 해결할 수 있다면 큰 도움이 될 것입니다. 올바른 절차를 따르고 충분한 정보를 얻길 바랍니다. 텍스트 벽에 대해 유감스럽게 생각합니다. 문제를 해결하기 위해 노력하고 있습니다. 적어도 이것을 읽어 주셔서 감사합니다!

+0

나는 http://stackoverflow.com/help/mcve를 제공하는 것이 여기에 복잡 할 수 있음을 볼 수 있지만 ... : 만 제대로하는 TreeModel를 업데이트하지 않습니다 부모 노드에 새로운 자식 노드를 추가하는 (그리고 따라서 트리) 자체 - 그게 바로 당신이 "desyncing"을 의미하는 것입니다. http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/DefaultTreeModel.html#insertNodeInto%28javax.swing.tree.MutableTreeNode,%20javax.swing.tree를 호출해야합니다. .MutableTreeNode, % 20int % 29. 또한 이것이 http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html#dynamic – Marco13

+0

에서 어떻게 사용되는지 알아보십시오. 그래, 잠시 동안이 질문을하지 않은 이유는 무엇입니까? 그것은 나 자신을 제외하고, 그러나 운 없음 지금까지. 내가 desyncing한다는 것은 데이터 트리에 대한 내 위치 마커가 그래픽 트리에 대한 위치 마커와 단계를 벗어난다는 것입니다. 재확인은 다른 곳에서 호출되며 결과를 변경하는 것으로 보이지 않습니다. 내가 이걸로 얻는 것은 내가 올바른 길을 가고 있다는 것이다. 자식 노드를 추가하면 의미가 있습니다. – ZimGee

+1

"revalidation"이 무슨 의미인지 모르겠다. ** ** 어떤 트랙이 당신에게 적합한 지 판단 할 수 없다 ;-)하지만 튜토리얼 사이트에서 "DynamicTreeDemo"를 실행하고 노드 삽입과 비교한다. 'DefaultMutableTreeModel # insertNodeInto'에 대해서는 적어도 잘못된 * 트랙이 될 수는 없습니다 – Marco13

답변

0

쉽게 이해하고 변경하기 위해 3 개의 클래스를 사용했습니다.

import java.io.*; 
import java.util.*; 
class TreeNode 
{ 
TreeNode left,right; 
int data; 
TreeNode() 
{ 
    data=0; 
    left=right=null; 
} 
TreeNode(int n) 
{ 
    data=n; 
    left=right=null; 
} 
void disp() 
{ 
    System.out.println(data+" "); 
} 
void setLeft(TreeNode n) 
{ 
    left=n; 
} 
void setRight(TreeNode n) 
{ 
    right=n; 
} 
TreeNode getLeft() 
{ 
    return left; 
} 
TreeNode getRight() 
{ 
    return right; 
} 
void setData(int d) 
{ 
    data=d; 
} 
int getData() 
{ 
    return data; 
} 
} 


class BinaryTree 
{ 
TreeNode root; 
BinaryTree() 
{ 
    root=null; 
} 
void insert(int data) 
{ 
    root=insert(root, data); 
} 
TreeNode insert(TreeNode node, int data) 
{ 
    if(node==null) 
    { 
     node=new TreeNode(data); 
    } 
    else 
    { 
     if(data<=node.data) 
     { 
      node.left=insert(node.left, data); 
     } 
     else 
     { 
      node.right=insert(node.right, data); 
     } 
    } 
    return(node); 
} 
void inorder() 
{ 
    inorder(root); 
    System.out.println(); 
} 
void inorder(TreeNode r) 
{ 
    if(r!=null) 
    { 
     inorder(r.getLeft()); 
     System.out.print(r.getData()+" "); 
     inorder(r.getRight()); 
    } 
} 
void preorder() 
{ 
    preorder(root); 
    System.out.println(); 
} 
void preorder(TreeNode r) 
{ 
    if(r!=null) 
    { 
     System.out.print(r.getData()+" "); 
     preorder(r.getLeft()); 
     preorder(r.getRight()); 
    } 
} 
void postorder() 
{ 
    postorder(root); 
    System.out.println(); 
} 
void postorder(TreeNode r) 
{ 
    if(r!=null) 
    {    
     postorder(r.getLeft()); 
     postorder(r.getRight()); 
     System.out.print(r.getData()+" "); 
    } 
    } 
    } 


    import java.io.*; 
    import java.util.*; 
    class btTraversal 
{ 
BinaryTree bt; 
void main() throws IOException 
{ 
    bt=new BinaryTree(); 
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
    int val; 
    char ch=' '; 
    String clearbuffer; 
    do 
    { 
     System.out.print("Enter a number: "); 
     val=Integer.parseInt(br.readLine()); 
     bt.insert(val); 
     System.out.print("Do you wish to enter more values (Y/N)....."); 
     ch=(char)br.read(); 
     clearbuffer=br.readLine(); 
    }while(ch=='y'||ch=='Y'); 
    System.out.println("Postorder traversal of given tree is: "); 
    bt.postorder(); 
    System.out.println("Preorder traversal of given tree is: "); 
    bt.preorder(); 
    System.out.println("Inorder traversal of given tree is: "); 
    bt.inorder(); 
} 
} 
+0

내 문제를 오해했을 수도 있습니다. 실제 이진 트리 클래스에는 문제가없고 내 문제는 JTree 표현과 GUI를 사용하여 노드를 데이터 및 그래픽 트리에 동 기적으로 추가 및 제거합니다. – ZimGee

+0

죄송합니다. 실수로 올바르게 읽지 못했습니다. –

+0

걱정하지 마십시오. 어느 경우이든 간결합니다. 대답, 그냥 잘못된 질문! 하하 – ZimGee