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

测试结果:


目录
打赏
0
0
0
0
2
分享
相关文章
|
5天前
|
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
37 9
 算法系列之数据结构-二叉树
|
2月前
|
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
60 12
|
2月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
58 10
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
58 2
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
67 5
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
138 4
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
79 6
|
4月前
|
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
236 8
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等