zoukankan      html  css  js  c++  java
  • 层次序创建二叉树(图形界面和控制台输入实现)

      1 2018.11.7
      2 XT
      3 
      4 /**
      5  * 功能:构造二叉树
      6  * 说明:
      7  * 1.主函数输入模式有两种,BT参数 true 图形界面,false  控制台输入
      8  * 2.构造树是按层次遍历结果输入的 如:ABCDE*F**GH
      9  */
     10 
     11 import javax.swing.*;
     12 import java.awt.*;
     13 import java.awt.event.ActionEvent;
     14 import java.awt.event.ActionListener;
     15 import java.io.BufferedReader;
     16 import java.io.IOException;
     17 import java.io.InputStreamReader;
     18 
     19 public class BT extends JFrame implements ActionListener {
     20     private BufferedReader br=null;
     21     private MyPanel myPanel;
     22     private JTextField jtf;
     23     private JButton jb1, jb2;
     24     private JLabel jl;
     25 
     26     public BT(boolean isGUIMode) {
     27         if (isGUIMode) {
     28             this.setLayout(null); //自定义布局
     29             jtf = new JTextField("");
     30             jtf.setFont(new Font("宋体", Font.BOLD, 16));//Arial
     31             jtf.setColumns(40);
     32             jb1 = new JButton("确定");
     33             jb2 = new JButton("重置");
     34             jb1.setFont(new Font("宋体",Font.PLAIN,16));
     35             jb2.setFont(new Font("宋体",Font.PLAIN,16));//设置按钮的字体
     36             jl = new JLabel("输入");
     37             jl.setFont(new Font("华文行楷",Font.PLAIN,20));//设置标签的字体样式
     38 
     39             jl.setBounds(35, 20, 50, 50); //如果设置了绝对布局,那么要通过setBounds()来设置绝对位置与绝对大小
     40             jtf.setBounds(80, 30, 350, 30);
     41             jb1.setBounds(120, 100, 100, 25);
     42             jb2.setBounds(270, 100, 100, 25);
     43             this.add(jl);
     44             this.add(jtf);
     45             this.add(jb1);
     46             this.add(jb2);
     47 
     48             myPanel = new MyPanel();
     49             Thread t = new Thread(myPanel);
     50             t.start();//启动线程
     51             myPanel.setBounds(0, 150, 3000, 200);//如果没挡住了的话是不会调用paint方法的
     52             this.add(myPanel);
     53             this.setTitle("BuildTree");
     54             this.setVisible(true);
     55             this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     56             this.setSize(500, 380);
     57             this.setLocation(500, 200);
     58 
     59             jb1.addActionListener(this);//注册监听
     60             jb2.addActionListener(this);
     61 
     62         } else {
     63             consoleInput();
     64         }
     65     }
     66 
     67     private void consoleInput() {
     68         br = new BufferedReader(new InputStreamReader(System.in));
     69         System.out.print("Input:");
     70         try {
     71             String input = br.readLine();
     72             while (!input.equals("q")) {
     73                 char[] nodes = input.toCharArray();
     74                 TreeNode treeNode = create(nodes, 0);
     75                 System.out.println("前序:" + displayPreOrder(treeNode));
     76                 System.out.println("中序:" + displayInOrder(treeNode));
     77                 System.out.println("后序:" + displayPostOrder(treeNode));
     78                 System.out.print("Input:");
     79                 input = br.readLine();
     80             }
     81         } catch (IOException e) {
     82             try {
     83                 br.close();
     84             } catch (IOException e1) {
     85                 e1.printStackTrace();
     86             }
     87             e.printStackTrace();
     88         }
     89     }
     90 
     91     private TreeNode create(char[] arr, int index) {
     92         if (index >= arr.length)       // 可以不需要,但是所有的值必须要写满,任一个#都要写,不然会越界
     93             return null;
     94         else if (String.valueOf(arr[index]).equals("#")||String.valueOf(arr[index]).equals("*")) {
     95             return null;
     96         } else {
     97             TreeNode node = new TreeNode(arr[index]);
     98             node.leftChild = create(arr, 2 * index + 1);
     99             node.rightChild = create(arr, 2 * index + 2);
    100             return node;
    101         }
    102     }
    103 
    104     private static String displayInOrder(TreeNode treeNode) {
    105         //中序
    106         if (treeNode != null) {
    107             return displayInOrder(treeNode.leftChild) + (treeNode.data == '*' ? "" : treeNode.data) +
    108                     displayInOrder(treeNode.rightChild);
    109         }
    110         return "";
    111     }
    112 
    113     private static String displayPreOrder(TreeNode treeNode) {
    114         //前序
    115         if (treeNode != null) {
    116             return (treeNode.data == '*' ? "" : treeNode.data) + displayPreOrder(treeNode.leftChild) + displayPreOrder(treeNode.rightChild);
    117         }
    118         return "";
    119     }
    120 
    121     private static String displayPostOrder(TreeNode treeNode) {
    122         //中序
    123         if (treeNode != null) {
    124             return displayPostOrder(treeNode.leftChild) + displayPostOrder(treeNode.rightChild) + (treeNode.data == '*' ? "" : treeNode.data);
    125         }
    126         return "";
    127     }
    128 
    129     @Override
    130     public void actionPerformed(ActionEvent e) {
    131         if (e.getSource() == jb1) {
    132             String s = jtf.getText();
    133             if (s.matches("[A-Za-z]([A-Za-z]|\*|#)*")) {  //注意:是w就可以了,不要用/w,就代表字母下划线
    134                 myPanel.display(s.toCharArray());
    135             } else {
    136                 JOptionPane.showMessageDialog(null, "输入错误!
    请重试!","ERROR",JOptionPane.ERROR_MESSAGE);
    137                 jtf.setText("");
    138             }
    139         }
    140         else if (e.getSource() == jb2) {
    141             jtf.setText("");
    142         }
    143     }
    144 
    145     public static void main(String[] args) {
    146         new BT(true);
    147     }
    148 
    149     class MyPanel extends JPanel implements Runnable {
    150         String[] strings;
    151 
    152         MyPanel() {
    153             strings = new String[]{"", "", ""};
    154 //            this.setSize(100, 1000);//看来绝对布局里的setBounds()方法设置的大小具有更高优先级,可以覆盖这条设置
    155             this.setBackground(new Color(125, 134, 234));
    156         }
    157 
    158         public void display(char[] chars) {
    159             TreeNode treeNode = create(chars, 0);
    160             strings[0] = displayPreOrder(treeNode);
    161             strings[1] = displayInOrder(treeNode);
    162             strings[2] = displayPostOrder(treeNode);
    163         }
    164 
    165         @Override
    166         public void paint(Graphics g) {
    167             super.paint(g);//
    168             g.setFont(new Font("宋体", Font.BOLD, 24));
    169             g.drawString("前序: " + strings[0], 10, 50);
    170             g.drawString("中序: " + strings[1], 10, 100);
    171             g.drawString("后序: " + strings[2], 10, 150);
    172         }
    173 
    174         @Override
    175         public void run() {
    176             while (true) {
    177                 try {
    178                     Thread.sleep(500);
    179                     repaint();
    180                 } catch (InterruptedException e) {
    181                     e.printStackTrace();
    182                 }
    183             }
    184         }
    185     }
    186 
    187     class TreeNode {
    188         Character data;
    189         TreeNode leftChild;
    190         TreeNode rightChild;
    191         //含数据,二叉链表
    192         TreeNode(char data) {
    193             this.data = data;
    194             leftChild = null;
    195             rightChild = null;
    196         }
    197     }
    198 }
  • 相关阅读:
    django大全
    centos 下安装python3.6.2
    爬虫基础知识与简单爬虫实现
    HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)
    ZOJ5833 Tournament(递归打表)
    ZOJ4067 Books(贪心)
    ZOJ4062 Plants vs. Zombies(二分+贪心)
    ZOJ4060 Flippy Sequence(思维题)
    洛谷P2568 GCD(线性筛法)
    2018.11.6刷题记录
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/9926110.html
Copyright © 2011-2022 走看看