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实现的更多相关文章

  1. 二叉树JAVA实现

    为了克服对树结构编程的畏惧感和神秘感,下定决心将二叉树的大部分操作实现一遍,并希望能够掌握二叉树编程的一些常用技术和技巧.关于编程实现中的心得和总结,敬请期待!~ [1]  数据结构和表示: 二叉树的 ...

  2. 剑指Offer:面试题23——从上往下打印二叉树(java实现)

    问题描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 按照层次遍历的方法,使用队列辅助. 1.将根结点加入队列. 2.循环出队,打印当前元素,若该结点有左子树,则将其加入队列,若 ...

  3. 剑指offer【04】- 重建二叉树(java)

    题目:重建二叉树 考点:树 题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6, ...

  4. 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离

    数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...

  5. 数据结构之二叉树java实现

    二叉树是一种非线性数据结构,属于树结构,最大的特点就是度为2,也就是每个节点只有一个左子树和一个右子树.二叉树的操作主要为创建,先序遍历,中序遍历,后序遍历.还有层次遍历.遍历有两种方式,一是采用递归 ...

  6. 算法笔记_189:历届试题 横向打印二叉树(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树 ...

  7. 非递归遍历二叉树Java版的实现代码(没写层次遍历)

    直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...

  8. 22.从上往下打印二叉树 Java

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 就是二叉树的层序遍历.借助一个队列就可以实现.使用两个队列一个存放节点,一个存放值.先将根节点加入到队列中,然后遍历队列中的 ...

  9. 前序遍历构造已知二叉树(Java)

    public BiNode createBiTree() { Scanner input = new Scanner(System.in); int k = input.nextInt(); if(k ...

  10. 非递归遍历二叉树Java实现

    2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...

随机推荐

  1. p->next = q, p = q->next, q->next = p->next的区别

  2. 《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)

    1.简介 在做web自动化时,有些情况selenium的api无法完成,需要通过第三方手段比如js来完成实现,比如去改变某些元素对象的属性或者进行一些特殊的操作,本文将来讲解怎样来调用JavaScri ...

  3. Qt5 C++ GUI界面 开发环境配置 详细教程

    本博客已暂停更新,需要请转新博客http://www.whbwiki.com/333.html Qt 下载 Qt 体积很大,有 1GB~3GB,官方下载通道非常慢,相信很多读者会崩溃,所以建议大家使用 ...

  4. Linux基本命令学习-文件基本操作1

    关机重启 shutdown -h now #立即关机 shutdown -h 5 # 5秒后关机 #重启 shutdown -r now #立即重启 reboot halt #重启 文件相关 系统目录 ...

  5. Apache Kyuubi 在 T3 出行的深度实践

    支撑了80%的离线作业,日作业量在1W+ 大多数场景比 Hive 性能提升了3-6倍 多租户.并发的场景更加高效稳定 T3出行是一家基于车联网驱动的智慧出行平台,拥有海量且丰富的数据源.因为车联网数据 ...

  6. gcc: fatal error: limits.h: No such file or directory on macos

    重装gcc brew install gcc 软链接链到新的gcc和g++ https://stackoverflow.com/questions/56280122/gcc-fatal-error-l ...

  7. 『学了就忘』Linux基础命令 — 39、挂载U盘和挂载NTFS分区

    目录 1.在Linux系统中挂载U盘 (1)插入U盘 (2)查询U盘设备文件名 (3)挂载U盘 (4)U盘中的中文乱码 (5)U盘卸载 2.在Linux系统中挂载NTFS分区 (1)Linux的驱动加 ...

  8. 全球首发-基于.NET 6长线支持Zoomla!逐浪CMS v8.6.0正式发布

    传送门: https://www.z01.com/down/3778.shtml 全新Zoomla!逐浪CMS v8.6.0 全于首个基于.net 6长线支持的CMS-Zoomla!逐浪CMS v8. ...

  9. 你真的懂Redis的5种基本数据结构吗?

    摘要: 你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看. 本文分享自华为云社区<你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看>,作者:李子捌. 一 ...

  10. 面向对象中static的理解(1)

    class 对象名字{ data members; static data members; function members; static function members; } 每创建一个对象, ...