【Java数据结构】实现二叉树及其基本操作

简介: 【Java数据结构】实现二叉树及其基本操作

BinaryTree.java

1. import java.util.LinkedList;
2. import java.util.Queue;
3. 
4. public class BinaryTree {
5. 
6. static class TreeNode {
7. public char val;
8. public TreeNode left;//左孩子的引用
9. public TreeNode right;//右孩子的引用
10. 
11. public TreeNode(char val) {
12. this.val = val;
13.         }
14.     }
15. 
16. 
17. /**
18.      * 创建一棵二叉树 返回这棵树的根节点
19.      *
20.      * @return
21.      */
22. public TreeNode createTree() {
23.         TreeNode A=new TreeNode('A');
24.         TreeNode B=new TreeNode('B');
25.         TreeNode C=new TreeNode('C');
26.         TreeNode D=new TreeNode('D');
27.         TreeNode E=new TreeNode('E');
28.         TreeNode F=new TreeNode('F');
29.         A.left=B;
30.         A.right=C;
31.         C.left=F;
32.         B.left=D;
33.         B.right=E;
34. 
35. 
36. return A;
37. 
38.     }
39. 
40. // 前序遍历
41. public void preOrder(TreeNode root) {
42. if(root==null){
43. return;
44.         }
45.         System.out.print(root.val+" ");
46.         preOrder(root.left);
47.         preOrder(root.right);
48. 
49.     }
50. 
51. // 中序遍历
52. void inOrder(TreeNode root) {
53. if(root==null){
54. return;
55.         }
56.         inOrder(root.left);
57.         System.out.print(root.val+" ");
58.         inOrder(root.right);
59.     }
60. 
61. // 后序遍历
62. void postOrder(TreeNode root) {
63. if(root==null){
64. return;
65.         }
66.         postOrder(root.left);
67.         postOrder(root.right);
68.         System.out.print(root.val+" ");
69. 
70.     }
71. 
72. public static int nodeSize;
73. 
74. /**
75.      * 获取树中节点的个数:遍历思路
76.      */
77. public int size(TreeNode root) {
78. if(root==null){
79. return 0;
80.       }
81.       nodeSize++;
82.       size(root.left);
83.       size(root.right);
84. return nodeSize;
85. 
86.     }
87. 
88. /**
89.      * 获取节点的个数:子问题的思路
90.      *
91.      * @param root
92.      * @return
93.      */
94. public int size2(TreeNode root) {
95. if(root==null){
96. return 0;
97.        }
98. return size2(root.left)+size2(root.right)+1;
99.     }
100. 
101. 
102. /*
103.      获取叶子节点的个数:遍历思路
104.      */
105. public static int leafSize = 0;
106. 
107. public int getLeafNodeCount1(TreeNode root) {
108. if(root==null)return 0;
109. if(root.left==null&&root.right==null)
110.             leafSize++;
111.         getLeafNodeCount1(root.left);
112.         getLeafNodeCount1(root.right);
113. return leafSize;
114.     }
115. 
116. /*
117.      获取叶子节点的个数:子问题
118.      */
119. public int getLeafNodeCount2(TreeNode root) {
120. if(root==null)return 0;
121. if(root.left==null&&root.right==null)
122. return 1;
123. return getLeafNodeCount2(root.left)+getLeafNodeCount2(root.right);
124. 
125.     }
126. 
127. /*
128.     获取第K层节点的个数
129.      */
130. public int getKLevelNodeCount(TreeNode root, int k) {
131. if(root==null||k<=0)return 0;
132. if(k==1)return 1;
133. 
134. return getKLevelNodeCount(root.left,k-1)+getKLevelNodeCount(root.right,k-1);
135. 
136.     }
137. 
138. /*
139.      获取二叉树的高度
140. 
141.      */
142. public int getHeight(TreeNode root) {
143. 
144. if(root==null)return 0;
145. 
146. return Math.max(getHeight(root.left),getHeight(root.right))+1;
147.     }
148. 
149. 
150. // 检测值为value的元素是否存在
151. public TreeNode find(TreeNode root, char val) {
152. if(root==null)return null;
153. 
154. if(root.val==val)return root;
155. if(find(root.left,val)!=null)
156. return find(root,val);
157. if(find(root.right,val)!=null)
158. return find(root.right,val);
159. 
160. return null;
161. 
162.     }
163. 
164. //层序遍历
165. public void levelOrder(TreeNode root) {
166. if(root==null)return;
167. 
168.        Queue<TreeNode>qu=new LinkedList<>();
169.        qu.offer(root);
170. while(!qu.isEmpty()){
171. 
172.            TreeNode cur=qu.poll();
173.            System.out.print(cur.val+" ");
174. 
175. if(cur.left!=null)
176.                qu.offer(cur.left);
177. if(cur.right!=null)
178.                qu.offer(cur.right);
179. 
180.        }
181. 
182. 
183.     }
184. 
185. 
186. // 判断一棵树是不是完全二叉树
187. public boolean isCompleteTree(TreeNode root) {
188. if(root==null)return true;
189. 
190.        Queue<TreeNode>qu=new LinkedList<>();
191.        qu.offer(root);
192. while(!qu.isEmpty()){
193. 
194.            TreeNode cur=qu.poll();
195. if(cur!=null){
196.                qu.offer(cur.left);
197.                qu.offer(cur.right);
198.            }else{
199. break;
200.            }
201. 
202.        }
203. 
204. while(!qu.isEmpty()){
205.            TreeNode pop=qu.poll();
206. if(pop!=null)return false;
207. 
208.        }
209. return true;
210.     }
211. }

Test.java

1. public class Test {
2. public static void main(String[] args) {
3.         BinaryTree binaryTree=new BinaryTree();
4. 
5.         binaryTree.preOrder(binaryTree.createTree());
6.         System.out.println();
7. 
8.         binaryTree.inOrder(binaryTree.createTree());
9. 
10.         System.out.println();
11.         binaryTree.postOrder(binaryTree.createTree());
12.         System.out.println();
13.         System.out.println(binaryTree.size(binaryTree.createTree()));
14.         System.out.println(binaryTree.size2(binaryTree.createTree()));
15.         System.out.println(binaryTree.getLeafNodeCount1(binaryTree.createTree()));
16.         System.out.println(binaryTree.getLeafNodeCount2(binaryTree.createTree()));
17.         System.out.println(binaryTree.getKLevelNodeCount(binaryTree.createTree(), 3));
18.         System.out.println(binaryTree.getHeight(binaryTree.createTree()));
19.         System.out.println("=========================");
20.         binaryTree.levelOrder(binaryTree.createTree());
21.         System.out.println(binaryTree.isCompleteTree(binaryTree.createTree()));
22. 
23. 
24.     }
25. }

测试结果:


相关文章
|
2月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
53 1
|
3天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
15天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
36 5
|
1月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
88 4
|
1月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
52 6
|
1月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
135 8
|
1月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
2月前
|
存储 算法 Java
Java 中常用的数据结构
【10月更文挑战第20天】这些数据结构在 Java 编程中都有着广泛的应用,掌握它们的特点和用法对于提高编程能力和解决实际问题非常重要。
33 6
|
2月前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
35 1
|
1月前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
19 0