热门标签 | 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 }

 


推荐阅读
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 本文档详细介绍了软通动力Java开发工程师职位的笔试题目,涵盖了Java基础、集合框架、JDBC、JSP等内容,并提供了详细的答案解析。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
  • 每种编程语言都有其独特的完成任务的方式,这也说明了为什么有这么多语言可供选择。在JimHall的《不同的编程语言如何完成相同的事情》文章中,他演示了13种不同的语言如何使用不同的语 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
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社区 版权所有