2014-02-18 59 views
1

所以我有一个用户定义的二叉树类,我想用图形表示。 JTree似乎是这里最好的选择。我的类有一个对其当前位置的引用,以允许用户更轻松地遍历和抽象内部节点类。当下一个被调用时,它遍历并返回节点的值。二叉树图形表示麻烦

大部分情况下,我已经能够让这些树一起工作,但当用户添加节点时遇到了问题。我已经设置好了,所以他们可以添加左边的选择或者正确的选择 - 这与我保留的数据有关,所以它需要这样 - 我完全停留在如何做到这一点上。我实施它的方式目前不可撤销地解决了树木问题,直到需要退出并重新初始化以重新获得同步。

这里是我有问题的方法:

一些信息:

,尤其是圆形,DTREE是我的树类的一个对象,并gTree是一个JTree对象(数据树,树的图形)

- 方法getShortName(String)返回用于表示JTree中当前节点的标准化名称,该标准名称是从dTree对象中外推的。

//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(和因此树)本身 - 这就是你可能用“去同化”的意思。您必须致电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

中是如何使用它的,这就是为什么我一直在等待这个问题,试图它出来我自己,但目前还没有运气。我的意思是,数据树的位置标记与图形树的位置标记不一致。重新验证在别处被调用,并且不会改变结果。但是我从中得到的结果是,我正走在正确的道路上呢?我的意思是添加子节点。 – ZimGee

+1

不确定你的意思是“重新验证”,** I **无法判断哪个曲目适合你;-)但是从教程网站运行“DynamicTreeDemo”并将其与节点插入(特别是关于'DefaultMutableTreeModel#insertNodeInto'几乎不可能是*错误*轨道,至少 – Marco13

回答

0

为了便于理解和轻松进行更改,我使用了三个类。

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