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

 


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
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社区 版权所有