java - 二叉 TreeMap 形表示的麻烦

标签 java swing jtree

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

在大多数情况下,我已经能够让这些树一起工作,但是当用户添加节点时我遇到了问题。我已经设置好了,这样他们就可以添加左选择或右选择 - 这与我保留的数据很重要,所以它需要这样 - 我完全不知道如何做到这一点。目前我实现它的方式不可撤销地使树不同步,以至于需要退出并重新初始化才能重新获得同步。

以下是我遇到问题的方法:

一些信息:

-这里,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();
    }
}

如果有人能帮助我解决这个问题,我将不胜感激,我希望我遵循了正确的程序并提供了足够的信息。抱歉,文字墙太长了,我只是想确保我的问题得到解决。不过,感谢至少阅读到这里!

最佳答案

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

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();
}
}

关于java - 二叉 TreeMap 形表示的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21861621/

相关文章:

java - 在JAVA中找到两个日期范围的重叠并将其合并为一个日期范围

java - 如何要求用户在 intelliJ GUI Swing 中选择数据

java - DefaultMutableTreeNode-Text 太长?

java - 如何使用 JTree 从文件创建 TreeView ?

java - 不要在枚举字段内排序

java - 允许 native 代码直接访问java堆中的对象吗?

openssl - 私钥和公钥分开

java - 如何根据其他列数据禁用 jtable 复选框

Java Circle to Circle 碰撞检测

java - 我无法使用 JTree 监听器更改 cardLayout 中的卡