热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:层次序创建二叉树(图形界面和控制台输入实现)

本文由编程笔记#小编为大家整理,主要介绍了层次序创建二叉树(图形界面和控制台输入实现)相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了层次序创建二叉树(图形界面和控制台输入实现)相关的知识,希望对你有一定的参考价值。



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 }

 


推荐阅读
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
手机用户2602921555
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有