二叉树——Java实现
1 package struct;
2
3 interface Tree{
4 //插入元素
5 void insert(int value);
6 //中序遍历
7 void inOrder();
8 //先序遍历
9 void perOrder();
10 //后序遍历
11 void postOrder();
12 //层序遍历
13 //void levelOrder();
14 //求最小值
15 int getMinValue();
16 //求最小值
17 int getMaxValue();
18 //指定元素删除
19 boolean delete(int value);
20 //求元素个数
21 int length();
22 //求树的高度
23 int height();
24 }
25
26 //工厂类
27 class Factory1{
28 //构造函数
29 private Factory1(){}
30 public static Tree getTreeInstance(){
31 return new BinaryTreeImpl();
32 }
33 }
34
35 class BinaryTreeImpl implements Tree{
36 //根节点
37 private Node root;
38 private int size;
39 class Node{
40 //定义左子树
41 private Node leftChild;
42 //定义右子树
43 private Node rightChild;
44 private int data;
45 //以下为构造方法
46 public Node(int data){
47 this.data = data;
48 }
49 public Node(Node leftChild, Node rightChild, int data) {
50 super();
51 this.leftChild = leftChild;
52 this.rightChild = rightChild;
53 this.data = data;
54 }
55 }
56
57 //插入元素
58 public void insert(int data) {
59 Node node = new Node(data);
60 //空树
61 if(root == null){
62 root = node;
63 root.leftChild = null;
64 root.rightChild = null;
65 size++;
66 }else{
67 //非空树
68 Node current = root;
69 Node parent = null;
70 while(true){
71 if(data < current.data){
72 parent = current;
73 current = parent.leftChild;
74 //当前元素小于根节点,当前节点为空
75 if(current == null){
76 parent.leftChild = node;
77 size++;
78 break;
79 }
80 }else if(data > current.data){
81 parent = current;
82 current = parent.rightChild;
83 //当前元素大于根节点,且当前节点为空,否则继续循环使当前的current为根节点
84 if(current == null){
85 parent.rightChild = node;
86 size++;
87 break;
88 }
89 }else{
90 System.out.println("have same data in the binary tree;");
91 }
92 }//end of while
93 }
94 }
95 //中序遍历
96 public void inOrder() {
97 System.out.println("中序遍历:");
98 inOrder1(root);
99 System.out.println();
100 }
101 //中序遍历递归函数
102 private void inOrder1(Node node){
103 if( node == null){
104 return;
105 }
106 inOrder1(node.leftChild);
107 display(node);
108 inOrder1(node.rightChild);
109 }
110
111 //打印函数
112 private void display(Node node){
113 System.out.print(node.data+" ");
114 }
115
116 //前序遍历
117 public void perOrder() {
118 System.out.println("前序遍历:");
119 perOrder1(root);
120 System.out.println();
121 }
122 //前序遍历递归函数
123 private void perOrder1(Node node){
124 if(node == null){
125 return;
126 }
127 display(node);
128 perOrder1(node.leftChild);
129 perOrder1(node.rightChild);
130 }
131
132 //后序遍历
133 public void postOrder() {
134 System.out.println("后序遍历:");
135 postOrder1(root);
136 System.out.println();
137 }
138 //后续遍历递归函数
139 private void postOrder1(Node node){
140 if(node == null){
141 return;
142 }
143 postOrder1(node.leftChild);
144 postOrder1(node.rightChild);
145 display(node);
146 }
147 //层序遍历
148 /*
149 public void levelOrder() {
150 }
151 */
152 //求取树中元素最小值
153 public int getMinValue() {
154 Node node = root;
155 //空树无最小元素
156 if(root == null){
157 return -1;
158 }
159 Node current = node.leftChild;
160 while(true){
161 if(current.leftChild == null){
162 return current.data;
163 }
164 current = current.leftChild;
165 }
166 }
167 //求树中最大元素
168 public int getMaxValue(){
169 Node node = root;
170 if(node == null){
171 return -1;
172 }
173 Node current = node.rightChild;
174 while(true){
175 if(current.rightChild == null){
176 return current.data;
177 }
178 current = current.rightChild;
179 }
180 }
181 //删除树中元素
182 public boolean delete(int value) {
183 return false;
184 }
185 //求树中元素个数
186 public int length(){
187 return size;
188 }
189 //求树的高度
190 public int height(){
191 if(root == null){
192 return 0;
193 }
194 return height1(root);
195 }
196 private int height1(Node node) {
197 if(node!=null){
198 int lheight = height1(node.leftChild);
199 int rheight = height1(node.rightChild);
200 return lheight > rheight ? lheight+1:rheight+1;
201 }
202 return 0;
203 }
204 }
205 public class BinaryTree {
206 public static void main(String[] args) {
207 Tree tree = Factory1.getTreeInstance();
208 System.out.println("===============测试insert函数=====================");
209 tree.insert(2);
210 tree.insert(1);
211 tree.insert(5);
212 tree.insert(20);
213 tree.insert(3);
214 tree.insert(7);
215 tree.insert(0);
216 tree.insert(10);
217 System.out.println("\n"+"===============测试length函数====================="+"\n");
218 System.out.println(tree.length());
219 System.out.println("\n"+"===============测试inOrder函数====================="+"\n");
220 tree.inOrder();
221 System.out.println("\n"+"===============测试perOrder函数====================="+"\n");
222 tree.perOrder();
223 System.out.println("\n"+"===============测试postOrder函数====================="+"\n");
224 tree.postOrder();
225 System.out.println("\n"+"===============测试getMinValue函数====================="+"\n");
226 System.out.println(tree.getMinValue());
227 System.out.println("\n"+"===============测试getMaxValue函数====================="+"\n");
228 System.out.println(tree.getMaxValue());
229 System.out.println("\n"+"===============测试height函数====================="+"\n");
230 System.out.println(tree.height());
231 }
232 }


二叉树——Java实现的更多相关文章
- 二叉树JAVA实现
为了克服对树结构编程的畏惧感和神秘感,下定决心将二叉树的大部分操作实现一遍,并希望能够掌握二叉树编程的一些常用技术和技巧.关于编程实现中的心得和总结,敬请期待!~ [1] 数据结构和表示: 二叉树的 ...
- 剑指Offer:面试题23——从上往下打印二叉树(java实现)
问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...
- 剑指offer【04】- 重建二叉树(java)
题目:重建二叉树 考点:树 题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6, ...
- 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离
数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...
- 数据结构之二叉树java实现
二叉树是一种非线性数据结构,属于树结构,最大的特点就是度为2,也就是每个节点只有一个左子树和一个右子树.二叉树的操作主要为创建,先序遍历,中序遍历,后序遍历.还有层次遍历.遍历有两种方式,一是采用递归 ...
- 算法笔记_189:历届试题 横向打印二叉树(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树 ...
- 非递归遍历二叉树Java版的实现代码(没写层次遍历)
直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...
- 22.从上往下打印二叉树 Java
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 就是二叉树的层序遍历.借助一个队列就可以实现.使用两个队列一个存放节点,一个存放值.先将根节点加入到队列中,然后遍历队列中的 ...
- 前序遍历构造已知二叉树(Java)
public BiNode createBiTree() { Scanner input = new Scanner(System.in); int k = input.nextInt(); if(k ...
- 非递归遍历二叉树Java实现
2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...
随机推荐
- 使用jax加速Hamming Distance的计算
技术背景 一般认为Jax是谷歌为了取代TensorFlow而推出的一款全新的端到端可微的框架,但是Jax同时也集成了绝大部分的numpy函数,这就使得我们可以更加简便的从numpy的计算习惯中切换到G ...
- 不破不立,祝贺EDG夺得S11冠军。这一夜,我看到太多Flag成真
在昨晚11月6号夜进行的2021英雄联盟S11总决赛中,中国战队EDG夺冠!全国各地高校的男生宿舍像过年一般庆祝夺冠,高呼:EDG世界冠军! 前三局1:2的劣势下,第四局十分胶着,最终EDG顽 ...
- Mysql教程:(二)分组与函数查询group by
分组与函数查询 温馨提示:分组之后查询其他函数结果是不正确的: 分组函数:group by 按班级分组,查询出每班数学最高分:select class,max(maths) from score gr ...
- Java——去掉小数点后面多余的0
当小数点后位数过多,多余的0没有实际意义,根据业务需求需要去掉多余的0.后端存储浮点型数据一般会用到Bigdecimal 类型,可以调用相关方法去掉小数后多余0,然后转为string. public ...
- 自定义 axios
自定义 axios function axios({ url, method = 'GET', params = {}, data = {} }) { // 返回一个 promise 对象 retur ...
- Flink sql 之AsyncIO与LookupJoin的几个疑问 (源码分析)
本文源码基于flink 1.14 被同事问到几个关于AsyncIO和lookUp维表的问题所以翻了下源码,从源码的角度解惑这几个问题 对于AsyncIO不了解的可以看看之前写的这篇 <Flin ...
- logstash写入kakfa数据丢失的问题
metricbeat采集系统指标,发送到logstash,再写入kafka,发现kafka中的数据不完整,只有某一个指标, 查找原因发现是logstash配置编码问题,如下: input { beat ...
- windows 下 redis服务经常自动关闭
记一次线上服务器redis 经常掉线的问题 环境: windows service 2019, redis, java8, 由于服务器资源有限, 项目的数据库oracle, 缓存数据库redis和we ...
- JAVA学习(六)
今天先是把内存知识总结归纳地又学习了一遍,现在可以很清楚地描述JVM的内存是如何操作的了. 静态变量储存在方法区内存中,这个之前没有注意到,温故知新了. 如果一个引用是空的(就是指向null),那它在 ...
- Django笔记&教程 0-1 前言
Django 自学笔记兼学习教程第0章第1节--前言 点击查看教程总目录 1 最初的想法 自学Django已经有一段时间了,自认收获不少,学的还算可以,然而实际去做项目写代码的时候,很多用法记得不清, ...