5566 */
77
8+ import java .util .LinkedList ;
9+ import java .util .Queue ;
810import java .util .Stack ;
911
1012/**
1113 * 该类是二叉搜索树
1214 * 该树在实现的时候,不考虑数组中有重复的数字。
1315 * 节点的左子节点的值都小于这个节点的值,节点的右子节点的值都大于等于这个节点的值
14- * 该树并不是平衡二叉树,也就是说左右子树的树高可以存在很大的差距,这就导致了在极端情况下,存在只有左边的树,这样的查找时间复杂度就是o(N)
15- * 平均情况下 时间复杂度是o(lgN)
16- *
17- * 可以考虑是用平衡二叉树,保持了树的左右高度 不会超过1,但是带来的插入和删除的额外开销,因为每次插入删除,都需要调整平衡
18- * 但他的查找的时间复杂度是o(lgN)
19- *
20- * 二叉搜索树(BST)相比二分查找的优势,在于他不需要基于有序的数组,并且插入和删除的操作显然比二分查找的数组有快的多,
21- * 但是时间复杂度没有二分查找稳定
22- * 相比二叉平衡搜索树(AVL)而言,虽然多了插入和删除的优势,但是没有AVL稳定
2316 */
2417public class BinarySearchTree {
2518
@@ -163,6 +156,8 @@ public void preOrder2(Node node) {
163156 stack .push (tmp .left );
164157 }
165158 }
159+ System .out .println ("结束" );
160+
166161 }
167162 }
168163
@@ -186,6 +181,8 @@ public void inorder2(Node node) {
186181 cur = cur .left ;
187182 }
188183 }
184+ System .out .println ("结束" );
185+
189186 }
190187 }
191188
@@ -218,9 +215,35 @@ public void postOrder2(Node node) {
218215 while (!result .isEmpty ()) {
219216 System .out .print (result .pop ().data + "-->" );
220217 }
218+ System .out .println ("结束" );
219+
221220 }
222221 }
223222
223+ /**
224+ * 树的层次遍历,类似于图的BFS
225+ * @param root
226+ */
227+ public void levelRead (Node root ) {
228+ if (root == null ) return ;
229+ Queue <Node > queue = new LinkedList <>();
230+ queue .offer (root );
231+ while (!queue .isEmpty ()) {
232+ Node current = queue .poll ();
233+ System .out .print (current .data + "-->" );
234+ if (current .left != null ) {
235+ queue .offer (current .left );
236+ }
237+ if (current .right != null ) {
238+ queue .offer (current .right );
239+ }
240+ }
241+ System .out .println ("结束" );
242+
243+ }
244+
245+
246+
224247
225248 /**
226249 * 得到树中最小的节点
@@ -258,28 +281,28 @@ public Node getMaxNode() {
258281
259282
260283 /**
261- * 通过先序遍历和中序遍历恢复一棵树
284+ * 从先序遍历和中序遍历中构造出树
262285 * @param preOrders
263286 * @param inOrders
264- * @param isLeft
287+ * @param r
265288 */
266- public void getTree (int [] preOrders , int [] inOrders ,boolean isLeft ) {
289+ public void getTree (int [] preOrders , int [] inOrders ,Node r ) {
267290 int root = preOrders [0 ];
268- if (isLeft ) {
269- System .out .println ("左" + root );
270- }else {
271- System .out .println ("右" + root );
272- }
291+ r .data = root ;
273292
274- int index = new Find (). binarySearchFind (inOrders , root );
293+ int index = findIndex (inOrders , root );
275294 int [] left = new int [index ];
276295 int [] preLeft = new int [index ];
277296 if (left .length != 0 ) {
278297 for (int i = 0 ; i < index ; i ++) {
279298 left [i ] = inOrders [i ];
280299 preLeft [i ] = preOrders [i + 1 ];
281300 }
301+ Node node = new Node (preLeft [0 ]);
302+ r .left = node ;
282303 }
304+
305+
283306 int size = inOrders .length - index - 1 ;
284307 int [] right = new int [inOrders .length - index - 1 ];
285308 int [] preRight = new int [size ];
@@ -288,17 +311,17 @@ public void getTree(int[] preOrders, int[] inOrders,boolean isLeft) {
288311 right [i ] = inOrders [i + index + 1 ];
289312 preRight [i ] = preOrders [preLeft .length + i + 1 ];
290313 }
314+ Node node = new Node (preRight [0 ]);
315+ r .right = node ;
291316 }
292317
293318 if (preLeft .length != 0 ) {
294- getTree (preLeft , left ,true );
319+ getTree (preLeft , left ,r . left );
295320 }
296321
297322 if (preRight .length != 0 ) {
298- getTree (preRight , right ,false );
323+ getTree (preRight , right ,r . right );
299324 }
300- System .out .println ();
301-
302325 }
303326
304327 public static class Node {
@@ -314,4 +337,13 @@ public Node(int data) {
314337 public Node getRoot () {
315338 return root ;
316339 }
340+
341+ private int findIndex (int [] nums , int target ) {
342+ for (int i = 0 ; i < nums .length ;i ++) {
343+ if (nums [i ] == target ) {
344+ return i ;
345+ }
346+ }
347+ return -1 ;
348+ }
317349}
0 commit comments