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. python基础数据类型语法

    #标识符:我们自己在写代码的时候,取的名字.#项目名 project name#包名 package name#模块名 .py ptthon文件名#规范:由字母数字下划线组成,但不能以数字#简明知意: ...

  2. 剖析虚幻渲染体系(12)- 移动端专题Part 2(GPU架构和机制)

    目录 12.4 移动渲染技术要点 12.4.1 Tile-based (Deferred) Rendering 12.4.2 Hierarchical Tiling 12.4.3 Early-Z 12 ...

  3. 详解calc()函数功能

    calc()对大家来说,或许很陌生,不太会相信calc()是css中的部分.因为看其外表像个函数,既然是函数为何又出现在CSS中呢?这一点也让我百思不得其解,今天有一同事告诉我,说CSS3中有一个属性 ...

  4. MarkdownPad2 注册码

    邮箱: Soar360@live.com 授权秘钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6b ...

  5. 「期末」一文带你系统回顾C 语言

    超详细 c 语言回顾 前言 c 语言是一种底层语言,是一种系统底层级的语言,例如Windows.Linux.Unix等操作系统就是使用c语言编写的.所以由此看来,不论是火爆了25年的Java,还是近年 ...

  6. 快速搭建 kvm web 管理工具 WebVirtMgr

    作者:SRE运维博客 博客地址: https://www.cnsre.cn/ 文章地址:https://www.cnsre.cn/posts/211117937177/ 相关话题:https://ww ...

  7. Android LayoutInflater(布局填充器)

    先来看一下LayoutInflater的基本用法吧,它的用法非常简单,首先需要获取到LayoutInflater的实例,有两种方法可以获取到,第一种写法如下: LayoutInflater layou ...

  8. [cf1427E]Xum

    假设$x$的最高位为$2^{t}$(即$2^{t}\le x<2^{t+1}$),并构造出$y=2^{t}x\oplus x$,不难发现两者仅在第$t$位上均为1,那么根据异或的性质可得$y=( ...

  9. [bzoj1068]压缩

    用f[i][j][0/1]表示区间[i,j],i之前有没有M的最少需要多少个字符,然后分两种情况:1.可以分为两个,转移到dp[l][mid][0]+1:2.枚举断点,但当前面有M时,后面的这个不能重 ...

  10. [loj2477]劈配

    考虑依次选择每一位考生,设当前选到第$i+1$位,前i个分别为$p1,p2,--pi$(注意:这里只确定了导师的志愿编号),然后枚举第$p_{i+1}$,通过网络流建图+判定,复杂度为$o(nm*f( ...