【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. }

测试结果:


相关文章
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
593 1
|
11月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
499 3
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
433 10
 算法系列之数据结构-二叉树
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
1085 1
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
507 12
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
268 10
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
660 3
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
286 5
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
439 4