二叉树——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 ...
随机推荐
- Eclipse简单介绍
1.编码设置:Windows>preference>Workspace>Other-UTF-8>apply and close: 2.字体大小设置:Windows>pre ...
- CF285D.D. Permutation Sum
CF285D. Permutation Sum 题目 大意 寻找a,b两个排列从0到n-1,有c[i]=(a[i]+b[i])%n+1,使得c[i]也为全排列的排列方式 思路 a中元素和b中元素的对应 ...
- Typora常用命令
目录 Typora编辑器所用语法--Markdown 简介 1.Markdown --标题 2. Markdown --列表(子标题) 3. Markdown --列表嵌套 4. Markdown - ...
- python实现圆检测
目录: (一)霍夫圆检测原理 (二)代码实现 (一)霍夫圆检测原理 (二)代码实现 1 #霍夫圆检测 2 import cv2 as cv 3 import numpy as np 4 5 def d ...
- [cf1444D]Rectangular Polyline
由于两种线段要交替出现,有解的必要条件即为$h=v$(以下均记为$n$) 进一步的,再假设两种线段依次对应于向量$(a_{i},0)$和$(0,b_{i})$,根据题意要求向量长度为给定值且和为0,那 ...
- Apache Kafka分布式流处理平台及大厂面试宝典v3.0.0
概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache Kafka官网地址 http://kafka.apache.org/ 最新版本为 3.0.0 Apach ...
- 7.4 k8s结合ceph rbd、cephfs实现数据的持久化和共享
1.在ceph集群中创建rbd存储池.镜像及普通用户 1.1.存储池接镜像配置 创建存储池 root@u20-deploy:~# ceph osd pool create rbd-test-pool1 ...
- Docker容器基础入门认知-网络篇
这篇文章中,会从 docker 中的单机中的 netns 到 veth,再到单机多个容器之间的 bridge 网络交互,最后到跨主机容器之间的 nat 和 vxlan 通信过程,让大家对 docker ...
- Swift-技巧(九)CGImage To CVPixelBuffer
摘要 iOS 中图像的表现形式不只是 Image,还有更加底层的方式,比如 CVPixelBuffer 像素缓存形式,那么 CGImage 就可以转换为像素缓存的方式也是需要了解的. CGImage ...
- BehaviorTree.CPP行为树BT的队列节点(三)
Sequences(队列) 只要序列的所有子代返回SUCCESS,它便会对其进行Tick. 如果有任何子级返回FAILURE,则序列中止. 当前,该框架提供三种节点: Sequence Sequenc ...