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

 


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
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社区 版权所有