java 实现二叉树的可视化

public class BrinaryTree extends javax.swing.JFrame {

    /** Creates new form BrinaryTree */
    CreatNodes root;
    public BrinaryTree() {
        initComponents();
      DefaultMutableTreeNode dmt=new DefaultMutableTreeNode(50);
        ((DefaultTreeModel)jTree1.getModel()).setRoot(dmt);
       root=new CreatNodes(50,dmt);
         for(int i=1;i<Math.pow(2, 7);i++)
         {
         root.InsertTree(i,root);
         root.InsertTree(i-5,root);
        }
          //TreeNode rootnode=dmt;
         //JTree  tree = new JTree(rootnode);
       //  setViewportView(tree);
    }

  
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        JFrame = new javax.swing.JScrollPane();
        jTree1 = new javax.swing.JTree();
        OKbutton = new javax.swing.JButton();
        tempTextField = new javax.swing.JTextField();
        OKlabel = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTree1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        JFrame.setViewportView(jTree1);

        OKbutton.setText("确定");
        OKbutton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                OKbuttonMouseClicked(evt);
            }
        });
        OKbutton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                OKbuttonActionPerformed(evt);
            }
        });

        tempTextField.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tempTextFieldActionPerformed(evt);
            }
        });

        OKlabel.setText("点击显示结点");

        jLabel1.setText("jLabel1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(JFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(36, 36, 36)
                        .addComponent(tempTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(50, 50, 50)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(OKlabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(OKbutton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(27, 27, 27)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(JFrame, javax.swing.GroupLayout.PREFERRED_SIZE, 229, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(17, 17, 17)
                .addComponent(OKlabel, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(OKbutton, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tempTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addContainerGap(20, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        
class CreatNodes

{
    int data;
    CreatNodes lefttree;
    CreatNodes righttree;
    DefaultMutableTreeNode parent  ;
    CreatNodes(int data, DefaultMutableTreeNode dmt)
    {
        this.data=data;

        this.parent=dmt;
        this.lefttree=null;
        this.righttree=null;

    }
    public void InsertTree(int data,CreatNodes root)
    {
    //DefaultMutableTreeNode dmt1=new DefaultMutableTreeNode(1);
    //parent.add(dmt1);
    //DefaultMutableTreeNode dmt2=new DefaultMutableTreeNode(2);
    //dmt1.add(dmt2);

     if(data>=root.data)
     {
         if(root.righttree==null)
         {

             DefaultMutableTreeNode son=new DefaultMutableTreeNode(data);
             root.parent.add(son);
              root.righttree=new CreatNodes(data,son);
         }
        else

        {
             InsertTree(data,root.righttree);
        }
     }
    else
    {
         if(root.lefttree==null)
         {

             DefaultMutableTreeNode son=new DefaultMutableTreeNode(data);
             root.parent.add(son);
             root.lefttree=new CreatNodes(data,son);
         }
        else
        {
            InsertTree(data,root.lefttree);
        }
    }
}

       CreatNodes searchnode(int key)
       {
        return searchnode( root,key);
       }
       CreatNodes searchnode(CreatNodes node ,int key)
       {
          if(node==null)
          {
              return null;
          }
          else if(node.data==key)
          {
              return node;
          }
 else   if(key>node.data)
          {
          return searchnode(node.righttree,key);
 }
 else return searchnode(node.lefttree,key);

       }
}

    private void OKbuttonActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        int findnode = (int)(Double.parseDouble(tempTextField.getText()));
            
       OKlabel.setText("要查找的结点"+findnode);
      
       CreatNodes searchfindnode=root.searchnode(findnode);
       if(searchfindnode==null)
       {
           OKlabel.setText("没找到"+findnode);       }
 else{
       TreePath Path = new TreePath(((DefaultTreeModel)jTree1.getModel()).getPathToRoot(searchfindnode.parent));
       jTree1.makeVisible(Path);
       jTree1.addSelectionPath(Path);
        }

    }                                        

    private void tempTextFieldActionPerformed(java.awt.event.ActionEvent evt) {                                              
        // TODO add your handling code here:
     //DefaultMutableTreeNode selectedNode
//= (DefaultMutableTreeNode )tree.getLastSelectedPathComponent();


    }                                             

    private void OKbuttonMouseClicked(java.awt.event.MouseEvent evt) {                                      
        // TODO add your handling code here:

    }                                     

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new BrinaryTree().setVisible(true);
            }
        });
        //TextField msg=new TextField();
      
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane JFrame;
    private javax.swing.JButton OKbutton;
    private javax.swing.JLabel OKlabel;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JTree jTree1;
    private javax.swing.JTextField tempTextField;
    // End of variables declaration                   

}



这是运行之后的效果图,可以输入节点名称进行查找,树形结构也比较明确。


Java中,你可以使用一些库和工具来可视化二叉树。以下是一个示例,使用Swing库来实现二叉树可视化: ```java import javax.swing.*; import java.awt.*; class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } class TreePanel extends JPanel { private TreeNode root; public TreePanel(TreeNode root) { this.root = root; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); drawTree(g, getWidth() / 2, 30, root, getWidth() / 4); } private void drawTree(Graphics g, int x, int y, TreeNode node, int offsetX) { if (node == null) return; g.drawString(String.valueOf(node.val), x, y); if (node.left != null) { int childX = x - offsetX; int childY = y + 50; g.drawLine(x, y, childX, childY); drawTree(g, childX, childY, node.left, offsetX / 2); } if (node.right != null) { int childX = x + offsetX; int childY = y + 50; g.drawLine(x, y, childX, childY); drawTree(g, childX, childY, node.right, offsetX / 2); } } } public class BinaryTreeVisualization { public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new TreeNode(5); root.right.left = new TreeNode(6); root.right.right = new TreeNode(7); JFrame frame = new JFrame("Binary Tree Visualization"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 600); TreePanel treePanel = new TreePanel(root); frame.add(treePanel); frame.setVisible(true); } } ``` 这个示例创建了一个简单的二叉树,并使用Swing库中的JPanel来实现可视化。在`paintComponent`方法中,使用递归方式遍历二叉树的每个节点,并在对应的位置绘制节点值,并使用`drawLine`方法绘制节点之间的连线。最后,通过创建一个JFrame并将TreePanel添加到其中,可以显示二叉树可视化结果。 你可以根据需要自定义二叉树的结构和样式,以适应你的需求。这只是一个简单的示例,可以作为起点进行扩展和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值