From bd78e2943c366cffe1976c645adb2c13b2a85b01 Mon Sep 17 00:00:00 2001 From: xhp281 Date: Tue, 1 Mar 2022 00:54:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=90=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "AVL\346\240\221/.gitignore" | 9 - "AVL\346\240\221/.idea/vcs.xml" | 6 - .../src/com/xhp281/file/Files.java" | 36 - .../com/xhp281/printer/BinaryTreeInfo.java" | 20 - .../src/com/xhp281/printer/BinaryTrees.java" | 48 -- .../com/xhp281/printer/InorderPrinter.java" | 89 --- .../xhp281/printer/LevelOrderPrinter.java" | 528 -------------- .../src/com/xhp281/printer/Printer.java" | 32 - .../src/com/xhp281/printer/Strings.java" | 19 - .../src/com/xhp281/test/Main.java" | 50 -- .../src/com/xhp281/tree/AVLTree.java" | 289 -------- .../src/com/xhp281/tree/BST.java" | 221 ------ .../src/com/xhp281/tree/BinaryTree.java" | 336 --------- .../.gitignore" | 6 - .../.idea/vcs.xml" | 6 - .../src/com/xhp281/Person.java" | 38 - .../src/com/xhp281/file/Files.java" | 36 - .../com/xhp281/printer/BinaryTreeInfo.java" | 20 - .../src/com/xhp281/printer/BinaryTrees.java" | 48 -- .../com/xhp281/printer/InorderPrinter.java" | 89 --- .../xhp281/printer/LevelOrderPrinter.java" | 528 -------------- .../src/com/xhp281/printer/Printer.java" | 32 - .../src/com/xhp281/printer/Strings.java" | 19 - .../src/com/xhp281/test/Main.java" | 216 ------ .../com/xhp281/tree/BinarySearchTree.java" | 194 ----- .../src/com/xhp281/tree/BinaryTree.java" | 319 --------- .../\344\272\214\345\217\211\346\240\221.md" | 1 - .../.classpath" | 6 - .../.gitignore" | 9 - .../.project" | 17 - .../.settings/org.eclipse.jdt.core.prefs" | 11 - .../bin/com/xhp/ArrayList.class" | Bin 4381 -> 0 bytes .../bin/com/xhp/Assert.class" | Bin 556 -> 0 bytes .../bin/com/xhp/Main.class" | Bin 1360 -> 0 bytes .../bin/com/xhp/Person.class" | Bin 1022 -> 0 bytes .../src/com/xhp/ArrayList.java" | 175 ----- .../src/com/xhp/Assert.java" | 11 - .../src/com/xhp/Main.java" | 31 - .../src/com/xhp/Person.java" | 22 - .../.gitignore" | 6 - .../.idea/misc.xml" | 6 - .../.idea/modules.xml" | 8 - .../.idea/vcs.xml" | 6 - .../.idea/workspace.xml" | 610 ---------------- .../src/com/xhp281/Main.java" | 226 ------ .../src/com/xhp281/common/Asserts.java" | 11 - .../src/com/xhp281/common/Times.java" | 26 - .../src/com/xhp281/file/FileInfo.java" | 47 -- .../src/com/xhp281/file/Files.java" | 72 -- .../src/com/xhp281/map/HashMap.java" | 666 ------------------ .../src/com/xhp281/map/Map.java" | 42 -- .../src/com/xhp281/map/TreeMap.java" | 492 ------------- .../src/com/xhp281/model/Key.java" | 26 - .../src/com/xhp281/model/Person.java" | 47 -- .../src/com/xhp281/model/SubKey1.java" | 17 - .../src/com/xhp281/model/SubKey2.java" | 17 - .../com/xhp281/printer/BinaryTreeInfo.java" | 20 - .../src/com/xhp281/printer/BinaryTrees.java" | 48 -- .../com/xhp281/printer/InorderPrinter.java" | 89 --- .../xhp281/printer/LevelOrderPrinter.java" | 528 -------------- .../src/com/xhp281/printer/Printer.java" | 32 - .../src/com/xhp281/printer/Strings.java" | 19 - .../\345\223\210\345\270\214\350\241\250.iml" | 11 - .../src/Main.java" | 44 ++ .../src/Times.java" | 2 - "\346\230\240\345\260\204/.idea/misc.xml" | 6 - "\346\230\240\345\260\204/.idea/modules.xml" | 8 - "\346\230\240\345\260\204/.idea/vcs.xml" | 6 - .../.idea/workspace.xml" | 463 ------------ .../com/xhp281/file/FileInfo.class" | Bin 1527 -> 0 bytes .../com/xhp281/file/Files$1.class" | Bin 1515 -> 0 bytes .../com/xhp281/file/Files.class" | Bin 2594 -> 0 bytes .../com/xhp281/map/Map$Visitor.class" | Bin 607 -> 0 bytes .../com/xhp281/map/Map.class" | Bin 727 -> 0 bytes .../com/xhp281/map/TreeMap$Node.class" | Bin 1728 -> 0 bytes .../com/xhp281/map/TreeMap.class" | Bin 10011 -> 0 bytes .../com/xhp281/set/Set$Visitor.class" | Bin 563 -> 0 bytes .../com/xhp281/set/Set.class" | Bin 546 -> 0 bytes .../com/xhp281/set/TreeSet$1.class" | Bin 1119 -> 0 bytes .../com/xhp281/set/TreeSet.class" | Bin 2140 -> 0 bytes .../com/xhp281/test$1.class" | Bin 1224 -> 0 bytes .../com/xhp281/test$2.class" | Bin 1224 -> 0 bytes .../com/xhp281/test$3.class" | Bin 873 -> 0 bytes .../com/xhp281/test.class" | Bin 2822 -> 0 bytes .../src/com/xhp281/file/FileInfo.java" | 47 -- .../src/com/xhp281/file/Files.java" | 72 -- .../src/com/xhp281/map/Map.java" | 24 - .../src/com/xhp281/map/TreeMap.java" | 492 ------------- .../src/com/xhp281/set/Set.java" | 22 - .../src/com/xhp281/set/TreeSet.java" | 55 -- .../src/com/xhp281/test.java" | 74 -- .../\346\230\240\345\260\204.iml" | 11 - "\346\240\210/.gitignore" | 9 - "\346\240\210/src/com/xhp281/Main.java" | 22 - .../src/com/xhp281/common/AbstractList.java" | 77 -- .../src/com/xhp281/common/ArrayList.java" | 178 ----- .../src/com/xhp281/common/LinkedList.java" | 143 ---- .../src/com/xhp281/common/List.java" | 54 -- .../src/com/xhp281/stack/Stack.java" | 32 - .../.gitignore" | 6 - .../.idea/misc.xml" | 6 - .../.idea/modules.xml" | 8 - .../.idea/vcs.xml" | 6 - .../.idea/workspace.xml" | 405 ----------- .../src/com/xhp281/file/Files.java" | 36 - .../com/xhp281/printer/BinaryTreeInfo.java" | 20 - .../src/com/xhp281/printer/BinaryTrees.java" | 48 -- .../com/xhp281/printer/InorderPrinter.java" | 89 --- .../xhp281/printer/LevelOrderPrinter.java" | 528 -------------- .../src/com/xhp281/printer/Printer.java" | 32 - .../src/com/xhp281/printer/Strings.java" | 19 - .../src/com/xhp281/test/Main.java" | 117 --- .../src/com/xhp281/tree/AVLTree.java" | 202 ------ .../src/com/xhp281/tree/BBST.java" | 132 ---- .../src/com/xhp281/tree/BST.java" | 221 ------ .../src/com/xhp281/tree/BinaryTree.java" | 345 --------- .../src/com/xhp281/tree/RBTree.java" | 268 ------- .../\347\272\242\351\273\221\346\240\221.iml" | 11 - "\351\223\276\350\241\250/.gitignore" | 9 - .../src/com/xhp281/Main.java" | 57 -- .../circle/CircleDoubleLinkedList.java" | 248 ------- .../com/xhp281/circle/CircleLinkedList.java" | 165 ----- .../src/com/xhp281/single/ArrayList.java" | 188 ----- .../src/com/xhp281/single/LinkedList.java" | 143 ---- .../src/com/xhp281/single/LinkedList2.java" | 139 ---- .../src/com/xhp281/two/DoubleLinkList.java" | 204 ------ "\351\230\237\345\210\227/.gitignore" | 9 - .../src/com/xhp281/circle/CircleDeque.java" | 161 ----- .../src/com/xhp281/circle/CircleQueue.java" | 119 ---- .../src/com/xhp281/common/AbstractList.java" | 77 -- .../src/com/xhp281/common/ArrayList.java" | 177 ----- .../src/com/xhp281/common/LinkedList.java" | 141 ---- .../src/com/xhp281/common/List.java" | 54 -- .../src/com/xhp281/queue/Deque.java" | 88 --- .../src/com/xhp281/queue/Queue.java" | 66 -- .../src/com/xhp281/test/Main.java" | 101 --- "\351\233\206\345\220\210/.idea/misc.xml" | 6 - "\351\233\206\345\220\210/.idea/modules.xml" | 8 - "\351\233\206\345\220\210/.idea/vcs.xml" | 6 - .../.idea/workspace.xml" | 620 ---------------- .../com/xhp281/common/Times$Task.class" | Bin 205 -> 0 bytes .../com/xhp281/common/Times.class" | Bin 1649 -> 0 bytes .../com/xhp281/file/FileInfo.class" | Bin 1527 -> 0 bytes .../com/xhp281/file/Files$1.class" | Bin 1515 -> 0 bytes .../com/xhp281/file/Files.class" | Bin 2594 -> 0 bytes .../com/xhp281/list/AbstractList.class" | Bin 1901 -> 0 bytes .../com/xhp281/list/LinkedList$Node.class" | Bin 1094 -> 0 bytes .../com/xhp281/list/LinkedList.class" | Bin 3396 -> 0 bytes .../com/xhp281/list/List.class" | Bin 617 -> 0 bytes .../com/xhp281/printer/BinaryTreeInfo.class" | Bin 255 -> 0 bytes .../printer/BinaryTrees$PrintStyle.class" | Bin 1149 -> 0 bytes .../com/xhp281/printer/BinaryTrees.class" | Bin 1879 -> 0 bytes .../com/xhp281/printer/InorderPrinter.class" | Bin 2394 -> 0 bytes .../LevelOrderPrinter$LevelInfo.class" | Bin 834 -> 0 bytes .../printer/LevelOrderPrinter$Node.class" | Bin 5453 -> 0 bytes .../xhp281/printer/LevelOrderPrinter.class" | Bin 8292 -> 0 bytes .../com/xhp281/printer/Printer.class" | Bin 771 -> 0 bytes .../com/xhp281/printer/Strings.class" | Bin 1049 -> 0 bytes .../com/xhp281/set/LinkSet.class" | Bin 2091 -> 0 bytes .../com/xhp281/set/Set$Visitor.class" | Bin 563 -> 0 bytes .../com/xhp281/set/Set.class" | Bin 546 -> 0 bytes .../com/xhp281/set/TreeSet$1.class" | Bin 1051 -> 0 bytes .../com/xhp281/set/TreeSet.class" | Bin 2030 -> 0 bytes .../com/xhp281/test/Main$1.class" | Bin 892 -> 0 bytes .../com/xhp281/test/Main$2.class" | Bin 892 -> 0 bytes .../com/xhp281/test/Main$3.class" | Bin 722 -> 0 bytes .../com/xhp281/test/Main$4.class" | Bin 722 -> 0 bytes .../com/xhp281/test/Main.class" | Bin 3136 -> 0 bytes .../com/xhp281/tree/BBST.class" | Bin 2865 -> 0 bytes .../com/xhp281/tree/BST.class" | Bin 3837 -> 0 bytes .../com/xhp281/tree/BinaryTree$Node.class" | Bin 1609 -> 0 bytes .../com/xhp281/tree/BinaryTree$Visitor.class" | Bin 602 -> 0 bytes .../com/xhp281/tree/BinaryTree.class" | Bin 5289 -> 0 bytes .../com/xhp281/tree/RBTree$RBNode.class" | Bin 1318 -> 0 bytes .../com/xhp281/tree/RBTree.class" | Bin 4230 -> 0 bytes .../src/com/xhp281/file/FileInfo.java" | 47 -- .../src/com/xhp281/file/Files.java" | 72 -- .../src/com/xhp281/list/AbstractList.java" | 77 -- .../src/com/xhp281/list/LinkedList.java" | 141 ---- .../src/com/xhp281/list/List.java" | 54 -- .../com/xhp281/printer/BinaryTreeInfo.java" | 20 - .../src/com/xhp281/printer/BinaryTrees.java" | 48 -- .../com/xhp281/printer/InorderPrinter.java" | 89 --- .../xhp281/printer/LevelOrderPrinter.java" | 528 -------------- .../src/com/xhp281/printer/Printer.java" | 32 - .../src/com/xhp281/printer/Strings.java" | 19 - .../src/com/xhp281/set/LinkSet.java" | 68 -- .../src/com/xhp281/set/Set.java" | 23 - .../src/com/xhp281/set/TreeSet.java" | 64 -- .../src/com/xhp281/test/Main.java" | 105 --- .../src/com/xhp281/tree/BBST.java" | 83 --- .../src/com/xhp281/tree/BST.java" | 158 ----- .../src/com/xhp281/tree/BinaryTree.java" | 242 ------- .../src/com/xhp281/tree/RBTree.java" | 268 ------- .../\351\233\206\345\220\210.iml" | 11 - 195 files changed, 44 insertions(+), 15820 deletions(-) delete mode 100644 "AVL\346\240\221/.gitignore" delete mode 100644 "AVL\346\240\221/.idea/vcs.xml" delete mode 100644 "AVL\346\240\221/src/com/xhp281/file/Files.java" delete mode 100755 "AVL\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" delete mode 100755 "AVL\346\240\221/src/com/xhp281/printer/BinaryTrees.java" delete mode 100755 "AVL\346\240\221/src/com/xhp281/printer/InorderPrinter.java" delete mode 100755 "AVL\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" delete mode 100755 "AVL\346\240\221/src/com/xhp281/printer/Printer.java" delete mode 100755 "AVL\346\240\221/src/com/xhp281/printer/Strings.java" delete mode 100644 "AVL\346\240\221/src/com/xhp281/test/Main.java" delete mode 100644 "AVL\346\240\221/src/com/xhp281/tree/AVLTree.java" delete mode 100644 "AVL\346\240\221/src/com/xhp281/tree/BST.java" delete mode 100644 "AVL\346\240\221/src/com/xhp281/tree/BinaryTree.java" delete mode 100644 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/.gitignore" delete mode 100644 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/.idea/vcs.xml" delete mode 100644 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/Person.java" delete mode 100644 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/file/Files.java" delete mode 100755 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" delete mode 100755 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/BinaryTrees.java" delete mode 100755 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/InorderPrinter.java" delete mode 100755 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" delete mode 100755 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/Printer.java" delete mode 100755 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/Strings.java" delete mode 100644 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/test/Main.java" delete mode 100644 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/tree/BinarySearchTree.java" delete mode 100644 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/tree/BinaryTree.java" delete mode 100644 "\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/\344\272\214\345\217\211\346\240\221.md" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/.classpath" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/.gitignore" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/.project" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/.settings/org.eclipse.jdt.core.prefs" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/ArrayList.class" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Assert.class" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Main.class" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Person.class" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/ArrayList.java" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Assert.java" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Main.java" delete mode 100644 "\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Person.java" delete mode 100644 "\345\223\210\345\270\214\350\241\250/.gitignore" delete mode 100644 "\345\223\210\345\270\214\350\241\250/.idea/misc.xml" delete mode 100644 "\345\223\210\345\270\214\350\241\250/.idea/modules.xml" delete mode 100644 "\345\223\210\345\270\214\350\241\250/.idea/vcs.xml" delete mode 100644 "\345\223\210\345\270\214\350\241\250/.idea/workspace.xml" delete mode 100644 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/Main.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/common/Asserts.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/common/Times.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/file/FileInfo.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/file/Files.java" delete mode 100644 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/map/HashMap.java" delete mode 100644 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/map/Map.java" delete mode 100644 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/map/TreeMap.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/model/Key.java" delete mode 100644 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/model/Person.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/model/SubKey1.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/model/SubKey2.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/printer/BinaryTreeInfo.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/printer/BinaryTrees.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/printer/InorderPrinter.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/printer/LevelOrderPrinter.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/printer/Printer.java" delete mode 100755 "\345\223\210\345\270\214\350\241\250/src/com/xhp281/printer/Strings.java" delete mode 100644 "\345\223\210\345\270\214\350\241\250/\345\223\210\345\270\214\350\241\250.iml" create mode 100644 "\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260/src/Main.java" rename "\351\233\206\345\220\210/src/com/xhp281/common/Times.java" => "\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260/src/Times.java" (93%) mode change 100755 => 100644 delete mode 100644 "\346\230\240\345\260\204/.idea/misc.xml" delete mode 100644 "\346\230\240\345\260\204/.idea/modules.xml" delete mode 100644 "\346\230\240\345\260\204/.idea/vcs.xml" delete mode 100644 "\346\230\240\345\260\204/.idea/workspace.xml" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/FileInfo.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/Files$1.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/Files.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/Map$Visitor.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/Map.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/TreeMap$Node.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/TreeMap.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/Set$Visitor.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/Set.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/TreeSet$1.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/TreeSet.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$1.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$2.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$3.class" delete mode 100644 "\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test.class" delete mode 100755 "\346\230\240\345\260\204/src/com/xhp281/file/FileInfo.java" delete mode 100755 "\346\230\240\345\260\204/src/com/xhp281/file/Files.java" delete mode 100644 "\346\230\240\345\260\204/src/com/xhp281/map/Map.java" delete mode 100644 "\346\230\240\345\260\204/src/com/xhp281/map/TreeMap.java" delete mode 100644 "\346\230\240\345\260\204/src/com/xhp281/set/Set.java" delete mode 100644 "\346\230\240\345\260\204/src/com/xhp281/set/TreeSet.java" delete mode 100644 "\346\230\240\345\260\204/src/com/xhp281/test.java" delete mode 100644 "\346\230\240\345\260\204/\346\230\240\345\260\204.iml" delete mode 100644 "\346\240\210/.gitignore" delete mode 100644 "\346\240\210/src/com/xhp281/Main.java" delete mode 100644 "\346\240\210/src/com/xhp281/common/AbstractList.java" delete mode 100644 "\346\240\210/src/com/xhp281/common/ArrayList.java" delete mode 100644 "\346\240\210/src/com/xhp281/common/LinkedList.java" delete mode 100644 "\346\240\210/src/com/xhp281/common/List.java" delete mode 100644 "\346\240\210/src/com/xhp281/stack/Stack.java" delete mode 100644 "\347\272\242\351\273\221\346\240\221/.gitignore" delete mode 100644 "\347\272\242\351\273\221\346\240\221/.idea/misc.xml" delete mode 100644 "\347\272\242\351\273\221\346\240\221/.idea/modules.xml" delete mode 100644 "\347\272\242\351\273\221\346\240\221/.idea/vcs.xml" delete mode 100644 "\347\272\242\351\273\221\346\240\221/.idea/workspace.xml" delete mode 100644 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/file/Files.java" delete mode 100755 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" delete mode 100755 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/BinaryTrees.java" delete mode 100755 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/InorderPrinter.java" delete mode 100755 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" delete mode 100755 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/Printer.java" delete mode 100755 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/Strings.java" delete mode 100644 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/test/Main.java" delete mode 100644 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/AVLTree.java" delete mode 100644 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BBST.java" delete mode 100644 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BST.java" delete mode 100644 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BinaryTree.java" delete mode 100644 "\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/RBTree.java" delete mode 100644 "\347\272\242\351\273\221\346\240\221/\347\272\242\351\273\221\346\240\221.iml" delete mode 100644 "\351\223\276\350\241\250/.gitignore" delete mode 100644 "\351\223\276\350\241\250/src/com/xhp281/Main.java" delete mode 100644 "\351\223\276\350\241\250/src/com/xhp281/circle/CircleDoubleLinkedList.java" delete mode 100644 "\351\223\276\350\241\250/src/com/xhp281/circle/CircleLinkedList.java" delete mode 100644 "\351\223\276\350\241\250/src/com/xhp281/single/ArrayList.java" delete mode 100644 "\351\223\276\350\241\250/src/com/xhp281/single/LinkedList.java" delete mode 100644 "\351\223\276\350\241\250/src/com/xhp281/single/LinkedList2.java" delete mode 100644 "\351\223\276\350\241\250/src/com/xhp281/two/DoubleLinkList.java" delete mode 100644 "\351\230\237\345\210\227/.gitignore" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/circle/CircleDeque.java" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/circle/CircleQueue.java" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/common/AbstractList.java" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/common/ArrayList.java" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/common/LinkedList.java" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/common/List.java" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/queue/Deque.java" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/queue/Queue.java" delete mode 100644 "\351\230\237\345\210\227/src/com/xhp281/test/Main.java" delete mode 100644 "\351\233\206\345\220\210/.idea/misc.xml" delete mode 100644 "\351\233\206\345\220\210/.idea/modules.xml" delete mode 100644 "\351\233\206\345\220\210/.idea/vcs.xml" delete mode 100644 "\351\233\206\345\220\210/.idea/workspace.xml" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/common/Times$Task.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/common/Times.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/file/FileInfo.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/file/Files$1.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/file/Files.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/list/AbstractList.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/list/LinkedList$Node.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/list/LinkedList.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/list/List.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/BinaryTreeInfo.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/BinaryTrees$PrintStyle.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/BinaryTrees.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/InorderPrinter.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/LevelOrderPrinter$LevelInfo.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/LevelOrderPrinter$Node.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/LevelOrderPrinter.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/Printer.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/printer/Strings.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/set/LinkSet.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/set/Set$Visitor.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/set/Set.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/set/TreeSet$1.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/set/TreeSet.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/test/Main$1.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/test/Main$2.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/test/Main$3.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/test/Main$4.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/test/Main.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/tree/BBST.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/tree/BST.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/tree/BinaryTree$Node.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/tree/BinaryTree$Visitor.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/tree/BinaryTree.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/tree/RBTree$RBNode.class" delete mode 100644 "\351\233\206\345\220\210/out/production/\351\233\206\345\220\210/com/xhp281/tree/RBTree.class" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/file/FileInfo.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/file/Files.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/list/AbstractList.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/list/LinkedList.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/list/List.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/printer/BinaryTreeInfo.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/printer/BinaryTrees.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/printer/InorderPrinter.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/printer/LevelOrderPrinter.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/printer/Printer.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/printer/Strings.java" delete mode 100644 "\351\233\206\345\220\210/src/com/xhp281/set/LinkSet.java" delete mode 100644 "\351\233\206\345\220\210/src/com/xhp281/set/Set.java" delete mode 100644 "\351\233\206\345\220\210/src/com/xhp281/set/TreeSet.java" delete mode 100644 "\351\233\206\345\220\210/src/com/xhp281/test/Main.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/tree/BBST.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/tree/BST.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/tree/BinaryTree.java" delete mode 100755 "\351\233\206\345\220\210/src/com/xhp281/tree/RBTree.java" delete mode 100644 "\351\233\206\345\220\210/\351\233\206\345\220\210.iml" diff --git "a/AVL\346\240\221/.gitignore" "b/AVL\346\240\221/.gitignore" deleted file mode 100644 index 173454b..0000000 --- "a/AVL\346\240\221/.gitignore" +++ /dev/null @@ -1,9 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### Example user template template -### Example user template - -# IntelliJ project files -.idea -*.iml -out -gen diff --git "a/AVL\346\240\221/.idea/vcs.xml" "b/AVL\346\240\221/.idea/vcs.xml" deleted file mode 100644 index 6c0b863..0000000 --- "a/AVL\346\240\221/.idea/vcs.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/AVL\346\240\221/src/com/xhp281/file/Files.java" "b/AVL\346\240\221/src/com/xhp281/file/Files.java" deleted file mode 100644 index 393faf5..0000000 --- "a/AVL\346\240\221/src/com/xhp281/file/Files.java" +++ /dev/null @@ -1,36 +0,0 @@ -package com.xhp281.file; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; - -/** - * User: FenDou - * Date: 2019-05-20 11:47 - * Description: - */ - -public class Files { - public static void writeToFile(String filePath, Object data) { - writeToFile(filePath, data, false); - } - - public static void writeToFile(String filePath, Object data, boolean append) { - if (filePath == null || data == null) return; - - try { - File file = new File(filePath); - if (!file.exists()) { - file.getParentFile().mkdirs(); - file.createNewFile(); - } - - try (FileWriter writer = new FileWriter(file, append); - BufferedWriter out = new BufferedWriter(writer) ) { - out.write(data.toString()); - out.flush(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git "a/AVL\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" "b/AVL\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" deleted file mode 100755 index 25ce322..0000000 --- "a/AVL\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" +++ /dev/null @@ -1,20 +0,0 @@ -package com.xhp281.printer; - -public interface BinaryTreeInfo { - /** - * who is the root node - */ - Object root(); - /** - * how to get the left child of the node - */ - Object left(Object node); - /** - * how to get the right child of the node - */ - Object right(Object node); - /** - * how to print the node - */ - Object string(Object node); -} diff --git "a/AVL\346\240\221/src/com/xhp281/printer/BinaryTrees.java" "b/AVL\346\240\221/src/com/xhp281/printer/BinaryTrees.java" deleted file mode 100755 index 1f0d6f5..0000000 --- "a/AVL\346\240\221/src/com/xhp281/printer/BinaryTrees.java" +++ /dev/null @@ -1,48 +0,0 @@ -package com.xhp281.printer; - -/** - * - * @author MJ Lee - * - */ -public final class BinaryTrees { - - private BinaryTrees() { - } - - public static void print(BinaryTreeInfo tree) { - print(tree, null); - } - - public static void println(BinaryTreeInfo tree) { - println(tree, null); - } - - public static void print(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return; - printer(tree, style).print(); - } - - public static void println(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return; - printer(tree, style).println(); - } - - public static String printString(BinaryTreeInfo tree) { - return printString(tree, null); - } - - public static String printString(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return null; - return printer(tree, style).printString(); - } - - private static Printer printer(BinaryTreeInfo tree, PrintStyle style) { - if (style == PrintStyle.INORDER) return new InorderPrinter(tree); - return new LevelOrderPrinter(tree); - } - - public enum PrintStyle { - LEVEL_ORDER, INORDER - } -} \ No newline at end of file diff --git "a/AVL\346\240\221/src/com/xhp281/printer/InorderPrinter.java" "b/AVL\346\240\221/src/com/xhp281/printer/InorderPrinter.java" deleted file mode 100755 index f26d136..0000000 --- "a/AVL\346\240\221/src/com/xhp281/printer/InorderPrinter.java" +++ /dev/null @@ -1,89 +0,0 @@ -package com.xhp281.printer; - -/** - - ┌──800 - ┌──760 - │ └──600 - ┌──540 - │ └──476 - │ └──445 - ┌──410 - │ └──394 -381 - │ ┌──190 - │ │ └──146 - │ ┌──40 - │ │ └──35 - └──12 - └──9 - - * @author MJ Lee - * - */ -public class InorderPrinter extends Printer { - private static String rightAppend; - private static String leftAppend; - private static String blankAppend; - private static String lineAppend; - static { - int length = 2; - rightAppend = "┌" + Strings.repeat("─", length); - leftAppend = "└" + Strings.repeat("─", length); - blankAppend = Strings.blank(length + 1); - lineAppend = "│" + Strings.blank(length); - } - - public InorderPrinter(BinaryTreeInfo tree) { - super(tree); - } - - @Override - public String printString() { - StringBuilder string = new StringBuilder( - printString(tree.root(), "", "", "")); - string.deleteCharAt(string.length() - 1); - return string.toString(); - } - - /** - * 生成node节点的字符串 - * @param nodePrefix node那一行的前缀字符串 - * @param leftPrefix node整棵左子树的前缀字符串 - * @param rightPrefix node整棵右子树的前缀字符串 - * @return - */ - private String printString( - Object node, - String nodePrefix, - String leftPrefix, - String rightPrefix) { - Object left = tree.left(node); - Object right = tree.right(node); - String string = tree.string(node).toString(); - - int length = string.length(); - if (length % 2 == 0) { - length--; - } - length >>= 1; - - String nodeString = ""; - if (right != null) { - rightPrefix += Strings.blank(length); - nodeString += printString(right, - rightPrefix + rightAppend, - rightPrefix + lineAppend, - rightPrefix + blankAppend); - } - nodeString += nodePrefix + string + "\n"; - if (left != null) { - leftPrefix += Strings.blank(length); - nodeString += printString(left, - leftPrefix + leftAppend, - leftPrefix + blankAppend, - leftPrefix + lineAppend); - } - return nodeString; - } -} diff --git "a/AVL\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" "b/AVL\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" deleted file mode 100755 index e994e9f..0000000 --- "a/AVL\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" +++ /dev/null @@ -1,528 +0,0 @@ -package com.xhp281.printer; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; - -/** - - ┌───381────┐ - │ │ -┌─12─┐ ┌─410─┐ -│ │ │ │ -9 ┌─40─┐ 394 ┌─540─┐ - │ │ │ │ - 35 ┌─190 ┌─476 ┌─760─┐ - │ │ │ │ - 146 445 600 800 - - * @author MJ Lee - * - */ -public class LevelOrderPrinter extends Printer { - /** - * 节点之间允许的最小间距(最小只能填1) - */ - private static final int MIN_SPACE = 1; - private Node root; - private int minX; - private int maxWidth; - - public LevelOrderPrinter(BinaryTreeInfo tree) { - super(tree); - - root = new Node(tree.root(), tree); - maxWidth = root.width; - } - - @Override - public String printString() { - // nodes用来存放所有的节点 - List> nodes = new ArrayList<>(); - fillNodes(nodes); - cleanNodes(nodes); - compressNodes(nodes); - addLineNodes(nodes); - - int rowCount = nodes.size(); - - // 构建字符串 - StringBuilder string = new StringBuilder(); - for (int i = 0; i < rowCount; i++) { - if (i != 0) { - string.append("\n"); - } - - List rowNodes = nodes.get(i); - StringBuilder rowSb = new StringBuilder(); - for (Node node : rowNodes) { - int leftSpace = node.x - rowSb.length() - minX; - rowSb.append(Strings.blank(leftSpace)); - rowSb.append(node.string); - } - - string.append(rowSb); - } - - return string.toString(); - } - - /** - * 添加一个元素节点 - */ - private Node addNode(List nodes, Object btNode) { - Node node = null; - if (btNode != null) { - node = new Node(btNode, tree); - maxWidth = Math.max(maxWidth, node.width); - nodes.add(node); - } else { - nodes.add(null); - } - return node; - } - - /** - * 以满二叉树的形式填充节点 - */ - private void fillNodes(List> nodes) { - if (nodes == null) return; - // 第一行 - List firstRowNodes = new ArrayList<>(); - firstRowNodes.add(root); - nodes.add(firstRowNodes); - - // 其他行 - while (true) { - List preRowNodes = nodes.get(nodes.size() - 1); - List rowNodes = new ArrayList<>(); - - boolean notNull = false; - for (Node node : preRowNodes) { - if (node == null) { - rowNodes.add(null); - rowNodes.add(null); - } else { - Node left = addNode(rowNodes, tree.left(node.btNode)); - if (left != null) { - node.left = left; - left.parent = node; - notNull = true; - } - - Node right = addNode(rowNodes, tree.right(node.btNode)); - if (right != null) { - node.right = right; - right.parent = node; - notNull = true; - } - } - } - - // 全是null,就退出 - if (!notNull) break; - nodes.add(rowNodes); - } - } - - /** - * 删除全部null、更新节点的坐标 - */ - private void cleanNodes(List> nodes) { - if (nodes == null) return; - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - // 最后一行的节点数量 - int lastRowNodeCount = nodes.get(rowCount - 1).size(); - - // 每个节点之间的间距 - int nodeSpace = maxWidth + 2; - - // 最后一行的长度 - int lastRowLength = lastRowNodeCount * maxWidth - + nodeSpace * (lastRowNodeCount - 1); - - // 空集合 - Collection nullSet = Collections.singleton(null); - - for (int i = 0; i < rowCount; i++) { - List rowNodes = nodes.get(i); - - int rowNodeCount = rowNodes.size(); - // 节点左右两边的间距 - int allSpace = lastRowLength - (rowNodeCount - 1) * nodeSpace; - int cornerSpace = allSpace / rowNodeCount - maxWidth; - cornerSpace >>= 1; - - int rowLength = 0; - for (int j = 0; j < rowNodeCount; j++) { - if (j != 0) { - // 每个节点之间的间距 - rowLength += nodeSpace; - } - rowLength += cornerSpace; - Node node = rowNodes.get(j); - if (node != null) { - // 居中(由于奇偶数的问题,可能有1个符号的误差) - int deltaX = (maxWidth - node.width) >> 1; - node.x = rowLength + deltaX; - node.y = i; - } - rowLength += maxWidth; - rowLength += cornerSpace; - } - // 删除所有的null - rowNodes.removeAll(nullSet); - } - } - - /** - * 压缩空格 - */ - private void compressNodes(List> nodes) { - if (nodes == null) return; - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - for (int i = rowCount - 2; i >= 0; i--) { - List rowNodes = nodes.get(i); - for (Node node : rowNodes) { - Node left = node.left; - Node right = node.right; - if (left == null && right == null) continue; - if (left != null && right != null) { - // 让左右节点对称 - node.balance(left, right); - - // left和right之间可以挪动的最小间距 - int leftEmpty = node.leftBoundEmptyLength(); - int rightEmpty = node.rightBoundEmptyLength(); - int empty = Math.min(leftEmpty, rightEmpty); - empty = Math.min(empty, (right.x - left.rightX()) >> 1); - - // left、right的子节点之间可以挪动的最小间距 - int space = left.minLevelSpaceToRight(right) - MIN_SPACE; - space = Math.min(space >> 1, empty); - - // left、right往中间挪动 - if (space > 0) { - left.translateX(space); - right.translateX(-space); - } - - // 继续挪动 - space = left.minLevelSpaceToRight(right) - MIN_SPACE; - if (space < 1) continue; - - // 可以继续挪动的间距 - leftEmpty = node.leftBoundEmptyLength(); - rightEmpty = node.rightBoundEmptyLength(); - if (leftEmpty < 1 && rightEmpty < 1) continue; - - if (leftEmpty > rightEmpty) { - left.translateX(Math.min(leftEmpty, space)); - } else { - right.translateX(-Math.min(rightEmpty, space)); - } - } else if (left != null) { - left.translateX(node.leftBoundEmptyLength()); - } else { // right != null - right.translateX(-node.rightBoundEmptyLength()); - } - } - } - } - - private void addXLineNode(List curRow, Node parent, int x) { - Node line = new Node("─"); - line.x = x; - line.y = parent.y; - curRow.add(line); - } - - private Node addLineNode(List curRow, List nextRow, Node parent, Node child) { - if (child == null) return null; - - Node top = null; - int topX = child.topLineX(); - if (child == parent.left) { - top = new Node("┌"); - curRow.add(top); - - for (int x = topX + 1; x < parent.x; x++) { - addXLineNode(curRow, parent, x); - } - } else { - for (int x = parent.rightX(); x < topX; x++) { - addXLineNode(curRow, parent, x); - } - - top = new Node("┐"); - curRow.add(top); - } - - // 坐标 - top.x = topX; - top.y = parent.y; - child.y = parent.y + 2; - minX = Math.min(minX, child.x); - - // 竖线 - Node bottom = new Node("│"); - bottom.x = topX; - bottom.y = parent.y + 1; - nextRow.add(bottom); - - return top; - } - - private void addLineNodes(List> nodes) { - List> newNodes = new ArrayList<>(); - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - minX = root.x; - - for (int i = 0; i < rowCount; i++) { - List rowNodes = nodes.get(i); - if (i == rowCount - 1) { - newNodes.add(rowNodes); - continue; - } - - List newRowNodes = new ArrayList<>(); - newNodes.add(newRowNodes); - - List lineNodes = new ArrayList<>(); - newNodes.add(lineNodes); - for (Node node : rowNodes) { - addLineNode(newRowNodes, lineNodes, node, node.left); - newRowNodes.add(node); - addLineNode(newRowNodes, lineNodes, node, node.right); - } - } - - nodes.clear(); - nodes.addAll(newNodes); - } - - private static class Node { - /** - * 顶部符号距离父节点的最小距离(最小能填0) - */ - private static final int TOP_LINE_SPACE = 1; - - Object btNode; - Node left; - Node right; - Node parent; - /** - * 首字符的位置 - */ - int x; - int y; - int treeHeight; - String string; - int width; - - private void init(String string) { - string = (string == null) ? "null" : string; - string = string.isEmpty() ? " " : string; - - width = string.length(); - this.string = string; - } - - public Node(String string) { - init(string); - } - - public Node(Object btNode, BinaryTreeInfo opetaion) { - init(opetaion.string(btNode).toString()); - - this.btNode = btNode; - } - - /** - * 顶部方向字符的X(极其重要) - * - * @return - */ - private int topLineX() { - // 宽度的一半 - int delta = width; - if (delta % 2 == 0) { - delta--; - } - delta >>= 1; - - if (parent != null && this == parent.left) { - return rightX() - 1 - delta; - } else { - return x + delta; - } - } - - /** - * 右边界的位置(rightX 或者 右子节点topLineX的下一个位置)(极其重要) - */ - private int rightBound() { - if (right == null) return rightX(); - return right.topLineX() + 1; - } - - /** - * 左边界的位置(x 或者 左子节点topLineX)(极其重要) - */ - private int leftBound() { - if (left == null) return x; - return left.topLineX(); - } - - /** - * x ~ 左边界之间的长度(包括左边界字符) - * - * @return - */ - private int leftBoundLength() { - return x - leftBound(); - } - - /** - * rightX ~ 右边界之间的长度(包括右边界字符) - * - * @return - */ - private int rightBoundLength() { - return rightBound() - rightX(); - } - - /** - * 左边界可以清空的长度 - * - * @return - */ - private int leftBoundEmptyLength() { - return leftBoundLength() - 1 - TOP_LINE_SPACE; - } - - /** - * 右边界可以清空的长度 - * - * @return - */ - private int rightBoundEmptyLength() { - return rightBoundLength() - 1 - TOP_LINE_SPACE; - } - - /** - * 让left和right基于this对称 - */ - private void balance(Node left, Node right) { - if (left == null || right == null) - return; - // 【left的尾字符】与【this的首字符】之间的间距 - int deltaLeft = x - left.rightX(); - // 【this的尾字符】与【this的首字符】之间的间距 - int deltaRight = right.x - rightX(); - - int delta = Math.max(deltaLeft, deltaRight); - int newRightX = rightX() + delta; - right.translateX(newRightX - right.x); - - int newLeftX = x - delta - left.width; - left.translateX(newLeftX - left.x); - } - - private int treeHeight(Node node) { - if (node == null) return 0; - if (node.treeHeight != 0) return node.treeHeight; - node.treeHeight = 1 + Math.max( - treeHeight(node.left), treeHeight(node.right)); - return node.treeHeight; - } - - /** - * 和右节点之间的最小层级距离 - */ - private int minLevelSpaceToRight(Node right) { - int thisHeight = treeHeight(this); - int rightHeight = treeHeight(right); - int minSpace = Integer.MAX_VALUE; - for (int i = 0; i < thisHeight && i < rightHeight; i++) { - int space = right.levelInfo(i).leftX - - this.levelInfo(i).rightX; - minSpace = Math.min(minSpace, space); - } - return minSpace; - } - - private LevelInfo levelInfo(int level) { - if (level < 0) return null; - int levelY = y + level; - if (level >= treeHeight(this)) return null; - - List list = new ArrayList<>(); - Queue queue = new LinkedList<>(); - queue.offer(this); - - // 层序遍历找出第level行的所有节点 - while (!queue.isEmpty()) { - Node node = queue.poll(); - if (levelY == node.y) { - list.add(node); - } else if (node.y > levelY) break; - - if (node.left != null) { - queue.offer(node.left); - } - if (node.right != null) { - queue.offer(node.right); - } - } - - Node left = list.get(0); - Node right = list.get(list.size() - 1); - return new LevelInfo(left, right); - } - - /** - * 尾字符的下一个位置 - */ - public int rightX() { - return x + width; - } - - public void translateX(int deltaX) { - if (deltaX == 0) return; - x += deltaX; - - // 如果是LineNode - if (btNode == null) return; - - if (left != null) { - left.translateX(deltaX); - } - if (right != null) { - right.translateX(deltaX); - } - } - } - - private static class LevelInfo { - int leftX; - int rightX; - - public LevelInfo(Node left, Node right) { - this.leftX = left.leftBound(); - this.rightX = right.rightBound(); - } - } -} diff --git "a/AVL\346\240\221/src/com/xhp281/printer/Printer.java" "b/AVL\346\240\221/src/com/xhp281/printer/Printer.java" deleted file mode 100755 index 9f91e23..0000000 --- "a/AVL\346\240\221/src/com/xhp281/printer/Printer.java" +++ /dev/null @@ -1,32 +0,0 @@ -package com.xhp281.printer; - -public abstract class Printer { - /** - * 二叉树的基本信息 - */ - protected BinaryTreeInfo tree; - - public Printer(BinaryTreeInfo tree) { - this.tree = tree; - } - - /** - * 生成打印的字符串 - */ - public abstract String printString(); - - /** - * 打印后换行 - */ - public void println() { - print(); - System.out.println(); - } - - /** - * 打印 - */ - public void print() { - System.out.print(printString()); - } -} diff --git "a/AVL\346\240\221/src/com/xhp281/printer/Strings.java" "b/AVL\346\240\221/src/com/xhp281/printer/Strings.java" deleted file mode 100755 index 402e957..0000000 --- "a/AVL\346\240\221/src/com/xhp281/printer/Strings.java" +++ /dev/null @@ -1,19 +0,0 @@ -package com.xhp281.printer; - -public class Strings { - public static String repeat(String string, int count) { - if (string == null) return null; - - StringBuilder builder = new StringBuilder(); - while (count-- > 0) { - builder.append(string); - } - return builder.toString(); - } - - public static String blank(int length) { - if (length < 0) return null; - if (length == 0) return ""; - return String.format("%" + length + "s", ""); - } -} diff --git "a/AVL\346\240\221/src/com/xhp281/test/Main.java" "b/AVL\346\240\221/src/com/xhp281/test/Main.java" deleted file mode 100644 index 05b4bc6..0000000 --- "a/AVL\346\240\221/src/com/xhp281/test/Main.java" +++ /dev/null @@ -1,50 +0,0 @@ -package com.xhp281.test; -import com.xhp281.tree.AVLTree; -import com.xhp281.tree.BST; -import com.xhp281.printer.BinaryTrees; - -/** - * User: FenDou - * Date: 2019-05-20 10:58 - * Description: - */ - -public class Main {// 创建比较器 - - /** - * 测试 - */ - static void avlTest(){ - Integer data[] = new Integer[] { - 100, 16, 48, 39, 21, 76, 51, 97, 4, 2, 35, 93, 66, 54, 71, 17 - }; - AVLTree avl = new AVLTree<>(); - for (int i = 0; i < data.length; i++) { - avl.add(data[i]); - } - BinaryTrees.println(avl); - - System.out.println("开始删除操作"); - avl.remove(2); - BinaryTrees.println(avl); - } - - static void countTest(){ - AVLTree avl = new AVLTree<>(); - for (int i = 0; i < 10; i++) { - avl.add(i); - } - BinaryTrees.println(avl); - - } - - /** - * 主函数 - * @param args - */ - public static void main(String[] args) { - - avlTest(); -// countTest(); - } -} diff --git "a/AVL\346\240\221/src/com/xhp281/tree/AVLTree.java" "b/AVL\346\240\221/src/com/xhp281/tree/AVLTree.java" deleted file mode 100644 index 7063ae0..0000000 --- "a/AVL\346\240\221/src/com/xhp281/tree/AVLTree.java" +++ /dev/null @@ -1,289 +0,0 @@ -package com.xhp281.tree; - -import java.util.Comparator; - -public class AVLTree extends BST{ - /** - * 初始化方法 - */ - public AVLTree(){ - this(null); - } - public AVLTree(Comparator comparator){ - super(comparator); - } - - /** - * 创建节点 - * @param element - * @param parent - * @return - */ - @Override - protected Node createNode(E element, Node parent) { - return new AVLNode<>(element,parent); - } - - /** - * AVL节点 - * @param - */ - private static class AVLNode extends Node { - // 叶子节点默认高度 1 - int height = 1; - public AVLNode(E element, Node parent) { - super(element, parent); - } - - /* 更新自己的高度 */ - public void updateHeight(){ - int leftHeight = leftNode == null ? 0 : ((AVLNode)leftNode).height; - int rightHeight = rightNode == null ? 0 : ((AVLNode)rightNode).height; - height = 1 + Math.max(leftHeight,rightHeight); - } - - /* 获取平衡因子 */ - public int balanceFactor(){ - int leftHeight = leftNode == null ? 0 : ((AVLNode)leftNode).height; - int rightHeight = rightNode == null ? 0 : ((AVLNode)rightNode).height; - return leftHeight - rightHeight; - } - - /* 获取度最高的节点 */ - public Node tallerChild() { - int leftHeight = leftNode == null ? 0 : ((AVLNode) leftNode).height; - int rightHeight = rightNode == null ? 0 : ((AVLNode) rightNode).height; - if (leftHeight > rightHeight) return leftNode; - if (leftHeight < rightHeight) return rightNode; - return isLeftChild() ? leftNode : rightNode; - } - - /* 打印内容 */ - @Override - public String toString() { - String parentString = "null"; - if (parent != null) { - parentString = parent.element.toString(); - } - return element + "";// + "_p(" + parentString + ")_h(" + height + ")"; - } - } - - /** - * 调整二叉树 - * @param node - */ - @Override - protected void addAfterFixNode(Node node) { - // 循环 - while ((node = node.parent) != null){ - - // 是平衡节点,更新高度 - if (isBalance(node)){ - updateHeight(node); - - // 调整平衡 - }else{ - // 恢复平衡 - rebalance(node); - // 整棵树都恢复平衡,结束循环 - break; - } - } - } - /** - * 删除之后调整失衡节点 - * @param node - */ - protected void removeAfterFixNode(Nodenode){ - while ((node = node.parent) != null){ - if (isBalance(node)){ - updateHeight(node); - }else{ - rebalance(node); - } - } - } - - /** - * 判断是不是平衡 - * @param node - * @return - */ - public boolean isBalance(Node node){ - return Math.abs(((AVLNode)node).balanceFactor()) <= 1; - } - - /** - * 更新高度 - * @param node - */ - public void updateHeight(Node node){ - ((AVLNode)node).updateHeight(); - } - - /** - * 恢复平衡方式1 - @param grand 高度最低的不平衡节点 - */ - public void rebalance(Node grand){ - Node parent = ((AVLNode)grand).tallerChild(); - Node node = ((AVLNode)parent).tallerChild(); - - // 属于左边 - if (parent.isLeftChild()){ - if (node.isLeftChild()){ // LL - rotate(grand,node.leftNode,node,node.rightNode,parent,parent.rightNode,grand,grand.rightNode); - }else{ // LR - rotate(grand,parent.leftNode,parent,node.leftNode,node,node.rightNode,grand,grand.rightNode); - } - }else{ - if (node.isLeftChild()){ // RL - rotate(grand,grand.leftNode,grand,node.leftNode,node,node.rightNode,parent,parent.rightNode); - }else{ // RR - rotate(grand,grand.leftNode,grand,parent.leftNode,parent,node.leftNode,node,node.rightNode); - } - } - } - /** - * 恢复平衡方式2 - @param grand 高度最低的不平衡节点 - */ - public void rebalance2(Node grand){ - Node parent = ((AVLNode)grand).tallerChild(); - Node node = ((AVLNode)parent).tallerChild(); - - // 属于左边 - if (parent.isLeftChild()){ - if (node.isLeftChild()){ // LL - rotateRight(grand); - }else{ // LR - rotateLeft(parent); - rotateRight(grand); - } - }else{ - if (node.isLeftChild()){ // RL - rotateRight(parent); - rotateLeft(grand); - }else{ // RR - rotateLeft(grand); - } - } - } - - /** - * 旋转 - */ - private void rotate( - Node p, - Node a,Node b,Node c, - Node d, - Node e,Node f,Node g){ - - // 设置d成为根节点 - d.parent = p.parent; - if (p.isLeftChild()){ - p.parent.leftNode = d; - }else if(p.isRightChild()){ - p.parent.rightNode = d; - }else{ - root = d; - } - - // 设置a-b-c - b.leftNode = a; - if (a != null){ - a.parent = b; - } - b.rightNode = c; - if (c != null){ - c.parent = b; - } - updateHeight(b); - - // 设置e-f-g - f.leftNode = e; - if (e != null){ - e.parent = f; - } - f.rightNode = g; - if (g != null){ - g.parent = f; - } - updateHeight(f); - - // 设置b-d-f - d.leftNode = b; - d.rightNode = f; - b.parent = d; - f.parent = d; - updateHeight(d); - } - - /** - * 左旋转 - * @param grand - */ - private void rotateLeft(Node grand){ - // RR的情况 - // 获取parent - Node parent = grand.rightNode; - Node parentOldLeft = parent.leftNode; - - // 交换子节点 - grand.rightNode = parentOldLeft; - parent.leftNode = grand; - - // 旋转之后处理 - afterRotate(grand,parent,parentOldLeft); - } - - /** - * 右旋转 - * @param grand - */ - private void rotateRight(Node grand){ - // LL情况 - Node parent = grand.leftNode; - Node parentOldRight = parent.rightNode; - - // 交换子节点 - grand.leftNode = parentOldRight; - parent.rightNode = grand; - - // 旋转之后处理 - afterRotate(grand,parent,parentOldRight); - } - - /** - * 旋转之后的处理 - * @param grand - * @param parent - * @param child - */ - private void afterRotate(Node grand,Node parent,Node child){ - // 更新parent根节点 - parent.parent = grand.parent; - - // 设置parent在根节点的左右位置 - if (grand.isLeftChild()){ - grand.parent.leftNode = parent; - }else if (grand.isRightChild()){ - grand.parent.rightNode = parent; - }else { - root = parent; - } - - // 更新parentOldRight的parent - if (child != null) { - child.parent = grand; - } - - // 更新grand的parent - grand.parent = parent; - - // 更新高度 - updateHeight(grand); - updateHeight(parent); - } -} diff --git "a/AVL\346\240\221/src/com/xhp281/tree/BST.java" "b/AVL\346\240\221/src/com/xhp281/tree/BST.java" deleted file mode 100644 index 776df83..0000000 --- "a/AVL\346\240\221/src/com/xhp281/tree/BST.java" +++ /dev/null @@ -1,221 +0,0 @@ -package com.xhp281.tree; -import java.util.Comparator; - -/** - * User: FenDou - * Date: 2019-05-17 13:53 - * Description: 二叉搜索树 - */ - -public class BST extends BinaryTree { - - private Comparator comparator; - - /** - * 初始化方式 - */ - public BST(){ - this(null); - } - public BST(Comparator comparator) { - this.comparator = comparator; - } - - /** - * 添加 - * @param element - */ - public void add(E element){ - checkElementIsNull(element); - - // 添加第一个节点 - if (root == null){ - root = createNode(element,null);//new Node<>(element,null); - size++; - - // 添加完新节点后处理 - addAfterFixNode(root); - return; - } - - // 父节点 - Node parent = root; - // 添加其他节点,首先找到父节点 - Node node = root; - // 比较结果 - int cmp = 0; - while (node != null){ - // 比较大小 - cmp = compare(element,node.element); - // 获取父节点 - parent = node; - // 新元素 > 父节点:去右边查找 - if (cmp > 0){ - node = node.rightNode; - // 新元素< 父节点:去左边查找 - }else if (cmp < 0){ - node = node.leftNode; - }else{ - // 相等直接返回 - node.element = element; - return; - } - } - // 判断是设置为左子树还是右子树 - // 获取新节点 - Node newNode = createNode(element,parent);//new Node<>(element,parent); - if (cmp > 0){ // 右 - parent.rightNode = newNode; - }else{ - parent.leftNode = newNode; - } - size++; - - // 添加完新节点后处理 - addAfterFixNode(newNode); - } - - /** - * 是否包含 - * @param element - * @return - */ - public boolean contains(E element){ - return node(element) != null; - } - - /** - * 检测是不是为空 - * @param element - */ - private void checkElementIsNull(E element){ - if (element == null) { - throw new IllegalArgumentException("element must be not null"); - } - } - - /** - * 比较大小 - * @param e1 - * @param e2 - * @return 返回值等于0:e1 = e2 返回值大于0:e1 > e2 返回值小于0: e1 < e2 - */ - private int compare(E e1,E e2){ - // 有判断条件的时候使用判断条件 - if (comparator != null){ - return comparator.compare(e1, e2); - } - return ((Comparable)e1).compareTo(e2); - } - - /** - * 添加之后修复失衡节点 - * @param node - */ - protected void addAfterFixNode(Nodenode){} - - /** - * 删除之后调整失衡节点 - * @param node - */ - protected void removeAfterFixNode(Nodenode){} - -// ================================= 删除操作 - - public void remove(E element){ - remove(node(element)); - } - - /** - * 删除节点 - * @param node - */ - private void remove(Node node){ - if (node == null) return; - size--; - // 度数为2的节点 - if (node.hasTwoChildren()){ - // 找到后继节点 - Node sNode = successor(node); - // 用后继节点的值覆盖度为2的节点的值 - node.element = sNode.element; - // 删除后继节点 - node = sNode; - } - - // 删除node节点,度为1或者0 - Node replaceElement = node.leftNode != null ? node.leftNode : node.rightNode; - // node 是度数为1的节点 - if (replaceElement != null){ - // 更改父节点 - replaceElement.parent = node.parent; - // 更改 parent 的left,right指向 - if (node.parent == null){ - root = replaceElement; - }else if (node == node.parent.leftNode){ - node.parent.leftNode = replaceElement; - }else{ - node.parent.rightNode = replaceElement; - } - - // 删除之后调整节点 - removeAfterFixNode(node); - }else if(node.parent == null){ - // node 是叶子节点并且是根节点 - root = null; - - // 删除之后调整节点 - removeAfterFixNode(node); - }else{ - // node 叶子节点但不是根节点 - if (node == node.parent.leftNode){ - node.parent.leftNode = null; - }else{ - node.parent.rightNode = null; - } - - // 删除之后调整节点 - removeAfterFixNode(node); - } - - } - - /** - * 根据内容获取节点 - * @param element - * @return - */ - private Node node(E element){ - Node node = root; - while (node != null){ - int cmp = compare(element,node.element); - // 相等的时候返回 - if (cmp == 0) return node; - // 输入值大于当前节点,从右面找 - if (cmp > 0 ){ - node = node.rightNode; - }else{ - // 输入值小于当前节点,从左面开始找 - node = node.leftNode; - } - } - return null; - } - -// // ================================== 打印方法 -// -// @Override -// public String toString() { -// StringBuilder sb = new StringBuilder(); -// toString(root,sb,""); -// return sb.toString(); -// } -// private void toString(Node node,StringBuilder sb,String prefix){ -// if (node == null) return; -// sb.append(prefix).append(node.element).append("\n"); -// toString(node.leftNode,sb,prefix + "L --> "); -// toString(node.rightNode,sb,prefix + "R --> "); -// } - - -} diff --git "a/AVL\346\240\221/src/com/xhp281/tree/BinaryTree.java" "b/AVL\346\240\221/src/com/xhp281/tree/BinaryTree.java" deleted file mode 100644 index e7b02dd..0000000 --- "a/AVL\346\240\221/src/com/xhp281/tree/BinaryTree.java" +++ /dev/null @@ -1,336 +0,0 @@ -package com.xhp281.tree; - -import com.xhp281.printer.BinaryTreeInfo; -import java.util.LinkedList; -import java.util.Queue; - -/** - * User: FenDou - * Date: 2019-05-21 19:03 - * Description: 二叉树基类 - */ - -public class BinaryTree implements BinaryTreeInfo { - - /* 大小 */ - protected int size; - /* 根节点 */ - protected Node root; - - public int size(){ - return size; - } - - public boolean isempry(){ - return size == 0; - } - - public void clear(){ - root = null; - size = 0; - } - - - /** - * 节点对象 - * @param - */ - protected static class Node{ - public E element; - public Node rightNode; - public Node leftNode; - public Node parent; - - public Node(E element, Node parent) { - this.element = element; - this.parent = parent; - } - - /* 是不是叶子节点 */ - public boolean isLeaf(){ - return leftNode == null && rightNode == null; - } - - /* 拥有两个节点 */ - public boolean hasTwoChildren(){ - return leftNode != null && rightNode != null; - } - - /* 是不是左子树 */ - public boolean isLeftChild(){ - return parent != null && this == parent.leftNode; - } - - /* 是不是右子树 */ - public boolean isRightChild(){ - return parent != null && this == parent.rightNode; - } - } - - /** - * 判断是不是二叉树 - * @return - */ - public Boolean isComplete(){ - if (root == null) return false; - Queue> queue = new LinkedList<>(); - queue.offer(root); - - // 是不是叶子节点 - boolean leaf = false; - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 如果不是叶子节点返回false - if (leaf && !node.isLeaf()) return false; - - if (node.leftNode != null){ - queue.offer(node.leftNode); - }else if (node.rightNode != null){ - return false; - } - - if (node.rightNode != null){ - queue.offer(node.rightNode); - }else{ - leaf = true; - } - } - return true; - } - - /** - * 创建节点 - * @param element - * @param parent - * @return - */ - protected Node createNode(E element,Node parent){ - return new Node<>(element,parent); - } - -//======================================= 获取节点 - /** - * 获取前驱节点 - * @param node - * @return - */ - public Node predecessor(Nodenode){ - if (node == null) return null; - // 前驱节点在左子树中 - - Node p = node.leftNode; - // 左子树不为空 node.left != null - if (p != null){ - // 循环遍历右子树 - while (p.rightNode != null){ - p = p.rightNode; - } - return p; - } - - // node.left = null && parent != null - while (node.parent != null && node == node.parent.leftNode){ - node = node.parent; - } - - // node.parent == null && node == node.parent.right - return node.parent; - } - /** - * 获取后驱节点 - * @param node - * @return - */ - public Node successor(Nodenode){ - if (node == null) return null; - // 前驱节点在右子树中 - - Node p = node.rightNode; - // 右子树不为空 node.right != null - if (p != null){ - // 循环遍历左子树 - while (p.leftNode != null){ - p = p.leftNode; - } - return p; - } - - // node.right = null && parent != null - while (node.parent != null && node == node.parent.rightNode){ - node = node.parent; - } - - // node.parent == null && node == node.parent.left - return node.parent; - } - -//======================================= 使用访问器接口进行遍历 - /** - * 访问器接口 - * @param - */ - public static abstract class Visitor{ - /* 是不是停止 */ - boolean stop; - /* 如果返回false停止遍历 */ - public abstract boolean visit(E element); - } - - /** - * 前序遍历 - */ - public void preorderOrder(Visitor visitor){ - if (visitor == null) return; - preorderOrder(root,visitor); - } - private void preorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - visitor.stop = visitor.visit(node.element); - preorderOrder(node.leftNode,visitor); - preorderOrder(node.rightNode,visitor); - } - - /** - * 中序遍历 - * 二叉搜索树的遍历结果是可以控制升序还是降序 - * 升序:中序遍历左子树、根节点、中序遍历右子树 - * 降序:中序遍历右子树、根节点、中序遍历左子树 - */ - public void inorderOrder(Visitor visitor){ - if (visitor == null) return; - inorderOrder(root,visitor); - } - private void inorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - inorderOrder(node.leftNode,visitor); - if (visitor.stop) return; - visitor.stop = visitor.visit(node.element); - inorderOrder(node.rightNode,visitor); - } - - /** - * 后序遍历遍历 - */ - public void postorderOrder(Visitor visitor){ - if (visitor == null) return; - postorderOrder(root,visitor); - } - - private void postorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - postorderOrder(node.leftNode,visitor); - postorderOrder(node.rightNode,visitor); - if (visitor.stop) return; - visitor.stop = visitor.visit(node.element); - } - - /** - * 层序遍历 - * @param visitor - */ - public void levelOrder(Visitor visitor){ - if (root == null|| visitor == null) return; - - Queue> queue = new LinkedList<>(); - queue.offer(root); - - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 判断是不是要返回 - if (visitor.visit(node.element)) return; - if (node.leftNode != null){ - queue.offer(node.leftNode); - } - if (node.rightNode != null){ - queue.offer(node.rightNode); - } - } - } - - -// ===================================== 计算二叉树高度 - /** - * 方式1 - * 获取树的高度,非递归方式 - * @return - */ - public int height(){ - if (root == null) return 0; - - // 树的高度 - int height = 0; - // 每层的数量 - int levelSize = 1; - - Queue> queue = new LinkedList<>(); - queue.offer(root); - - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 访问的时候数量减少 - levelSize--; - - if (node.leftNode != null){ - queue.offer(node.leftNode); - } - if (node.rightNode != null){ - queue.offer(node.rightNode); - } - - // 遍历完一层,将要遍历下一层的时候获取下一层的数量 - if (levelSize == 0){ - levelSize = queue.size(); - height++; - } - } - return height; - } - /** - * 方式2 - * @return - */ - public int height2(){ - return height(root); - } - - /** - * 递归方式获取高度 - * @param node - * @return - */ - public int height(Node node){ - if (node == null) return 0; - return 1 + Math.max(height(node.leftNode),height(node.rightNode)); - } - -// ================================= 二叉树打印接口设置 - @Override - public Object root() { - return root; - } - - @Override - public Object left(Object node) { - return ((Node)node).leftNode; - } - - @Override - public Object right(Object node) { - return ((Node)node).rightNode; - } - - @Override - public Object string(Object node) { - // 获取父节点内容 -// Node currNode = (Node)node; -// String parentString = "null"; -// if (currNode.parent != null){ -// parentString = currNode.parent.element.toString(); -// } -// return currNode.element + "(" + parentString + ")"; - return node; - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/.gitignore" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/.gitignore" deleted file mode 100644 index 10f5518..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/.gitignore" +++ /dev/null @@ -1,6 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -# IntelliJ project files -.idea -*.iml -out -gen diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/.idea/vcs.xml" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/.idea/vcs.xml" deleted file mode 100644 index 6c0b863..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/.idea/vcs.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/Person.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/Person.java" deleted file mode 100644 index 8213dea..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/Person.java" +++ /dev/null @@ -1,38 +0,0 @@ -package com.xhp281; - -/** - * User: FenDou - * Date: 2019-05-17 18:13 - * Description: - */ - -public class Person implements Comparable { - public int age; - public String name; - - public Person(int age) { - this.age = age; - } - - public Person(int age, String name) { - this.age = age; - this.name = name; - } - - public int getAge() { - return age; - } - - @Override - public int compareTo(Person e) { -// if (age > e.age) return 1; -// if (age < e.age) return -1; -// return 0; - return age - e.age; - } - - @Override - public String toString() { - return "" + age + "-" + name; - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/file/Files.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/file/Files.java" deleted file mode 100644 index 393faf5..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/file/Files.java" +++ /dev/null @@ -1,36 +0,0 @@ -package com.xhp281.file; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; - -/** - * User: FenDou - * Date: 2019-05-20 11:47 - * Description: - */ - -public class Files { - public static void writeToFile(String filePath, Object data) { - writeToFile(filePath, data, false); - } - - public static void writeToFile(String filePath, Object data, boolean append) { - if (filePath == null || data == null) return; - - try { - File file = new File(filePath); - if (!file.exists()) { - file.getParentFile().mkdirs(); - file.createNewFile(); - } - - try (FileWriter writer = new FileWriter(file, append); - BufferedWriter out = new BufferedWriter(writer) ) { - out.write(data.toString()); - out.flush(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" deleted file mode 100755 index 25ce322..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" +++ /dev/null @@ -1,20 +0,0 @@ -package com.xhp281.printer; - -public interface BinaryTreeInfo { - /** - * who is the root node - */ - Object root(); - /** - * how to get the left child of the node - */ - Object left(Object node); - /** - * how to get the right child of the node - */ - Object right(Object node); - /** - * how to print the node - */ - Object string(Object node); -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/BinaryTrees.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/BinaryTrees.java" deleted file mode 100755 index 1f0d6f5..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/BinaryTrees.java" +++ /dev/null @@ -1,48 +0,0 @@ -package com.xhp281.printer; - -/** - * - * @author MJ Lee - * - */ -public final class BinaryTrees { - - private BinaryTrees() { - } - - public static void print(BinaryTreeInfo tree) { - print(tree, null); - } - - public static void println(BinaryTreeInfo tree) { - println(tree, null); - } - - public static void print(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return; - printer(tree, style).print(); - } - - public static void println(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return; - printer(tree, style).println(); - } - - public static String printString(BinaryTreeInfo tree) { - return printString(tree, null); - } - - public static String printString(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return null; - return printer(tree, style).printString(); - } - - private static Printer printer(BinaryTreeInfo tree, PrintStyle style) { - if (style == PrintStyle.INORDER) return new InorderPrinter(tree); - return new LevelOrderPrinter(tree); - } - - public enum PrintStyle { - LEVEL_ORDER, INORDER - } -} \ No newline at end of file diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/InorderPrinter.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/InorderPrinter.java" deleted file mode 100755 index f26d136..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/InorderPrinter.java" +++ /dev/null @@ -1,89 +0,0 @@ -package com.xhp281.printer; - -/** - - ┌──800 - ┌──760 - │ └──600 - ┌──540 - │ └──476 - │ └──445 - ┌──410 - │ └──394 -381 - │ ┌──190 - │ │ └──146 - │ ┌──40 - │ │ └──35 - └──12 - └──9 - - * @author MJ Lee - * - */ -public class InorderPrinter extends Printer { - private static String rightAppend; - private static String leftAppend; - private static String blankAppend; - private static String lineAppend; - static { - int length = 2; - rightAppend = "┌" + Strings.repeat("─", length); - leftAppend = "└" + Strings.repeat("─", length); - blankAppend = Strings.blank(length + 1); - lineAppend = "│" + Strings.blank(length); - } - - public InorderPrinter(BinaryTreeInfo tree) { - super(tree); - } - - @Override - public String printString() { - StringBuilder string = new StringBuilder( - printString(tree.root(), "", "", "")); - string.deleteCharAt(string.length() - 1); - return string.toString(); - } - - /** - * 生成node节点的字符串 - * @param nodePrefix node那一行的前缀字符串 - * @param leftPrefix node整棵左子树的前缀字符串 - * @param rightPrefix node整棵右子树的前缀字符串 - * @return - */ - private String printString( - Object node, - String nodePrefix, - String leftPrefix, - String rightPrefix) { - Object left = tree.left(node); - Object right = tree.right(node); - String string = tree.string(node).toString(); - - int length = string.length(); - if (length % 2 == 0) { - length--; - } - length >>= 1; - - String nodeString = ""; - if (right != null) { - rightPrefix += Strings.blank(length); - nodeString += printString(right, - rightPrefix + rightAppend, - rightPrefix + lineAppend, - rightPrefix + blankAppend); - } - nodeString += nodePrefix + string + "\n"; - if (left != null) { - leftPrefix += Strings.blank(length); - nodeString += printString(left, - leftPrefix + leftAppend, - leftPrefix + blankAppend, - leftPrefix + lineAppend); - } - return nodeString; - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" deleted file mode 100755 index e994e9f..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" +++ /dev/null @@ -1,528 +0,0 @@ -package com.xhp281.printer; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; - -/** - - ┌───381────┐ - │ │ -┌─12─┐ ┌─410─┐ -│ │ │ │ -9 ┌─40─┐ 394 ┌─540─┐ - │ │ │ │ - 35 ┌─190 ┌─476 ┌─760─┐ - │ │ │ │ - 146 445 600 800 - - * @author MJ Lee - * - */ -public class LevelOrderPrinter extends Printer { - /** - * 节点之间允许的最小间距(最小只能填1) - */ - private static final int MIN_SPACE = 1; - private Node root; - private int minX; - private int maxWidth; - - public LevelOrderPrinter(BinaryTreeInfo tree) { - super(tree); - - root = new Node(tree.root(), tree); - maxWidth = root.width; - } - - @Override - public String printString() { - // nodes用来存放所有的节点 - List> nodes = new ArrayList<>(); - fillNodes(nodes); - cleanNodes(nodes); - compressNodes(nodes); - addLineNodes(nodes); - - int rowCount = nodes.size(); - - // 构建字符串 - StringBuilder string = new StringBuilder(); - for (int i = 0; i < rowCount; i++) { - if (i != 0) { - string.append("\n"); - } - - List rowNodes = nodes.get(i); - StringBuilder rowSb = new StringBuilder(); - for (Node node : rowNodes) { - int leftSpace = node.x - rowSb.length() - minX; - rowSb.append(Strings.blank(leftSpace)); - rowSb.append(node.string); - } - - string.append(rowSb); - } - - return string.toString(); - } - - /** - * 添加一个元素节点 - */ - private Node addNode(List nodes, Object btNode) { - Node node = null; - if (btNode != null) { - node = new Node(btNode, tree); - maxWidth = Math.max(maxWidth, node.width); - nodes.add(node); - } else { - nodes.add(null); - } - return node; - } - - /** - * 以满二叉树的形式填充节点 - */ - private void fillNodes(List> nodes) { - if (nodes == null) return; - // 第一行 - List firstRowNodes = new ArrayList<>(); - firstRowNodes.add(root); - nodes.add(firstRowNodes); - - // 其他行 - while (true) { - List preRowNodes = nodes.get(nodes.size() - 1); - List rowNodes = new ArrayList<>(); - - boolean notNull = false; - for (Node node : preRowNodes) { - if (node == null) { - rowNodes.add(null); - rowNodes.add(null); - } else { - Node left = addNode(rowNodes, tree.left(node.btNode)); - if (left != null) { - node.left = left; - left.parent = node; - notNull = true; - } - - Node right = addNode(rowNodes, tree.right(node.btNode)); - if (right != null) { - node.right = right; - right.parent = node; - notNull = true; - } - } - } - - // 全是null,就退出 - if (!notNull) break; - nodes.add(rowNodes); - } - } - - /** - * 删除全部null、更新节点的坐标 - */ - private void cleanNodes(List> nodes) { - if (nodes == null) return; - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - // 最后一行的节点数量 - int lastRowNodeCount = nodes.get(rowCount - 1).size(); - - // 每个节点之间的间距 - int nodeSpace = maxWidth + 2; - - // 最后一行的长度 - int lastRowLength = lastRowNodeCount * maxWidth - + nodeSpace * (lastRowNodeCount - 1); - - // 空集合 - Collection nullSet = Collections.singleton(null); - - for (int i = 0; i < rowCount; i++) { - List rowNodes = nodes.get(i); - - int rowNodeCount = rowNodes.size(); - // 节点左右两边的间距 - int allSpace = lastRowLength - (rowNodeCount - 1) * nodeSpace; - int cornerSpace = allSpace / rowNodeCount - maxWidth; - cornerSpace >>= 1; - - int rowLength = 0; - for (int j = 0; j < rowNodeCount; j++) { - if (j != 0) { - // 每个节点之间的间距 - rowLength += nodeSpace; - } - rowLength += cornerSpace; - Node node = rowNodes.get(j); - if (node != null) { - // 居中(由于奇偶数的问题,可能有1个符号的误差) - int deltaX = (maxWidth - node.width) >> 1; - node.x = rowLength + deltaX; - node.y = i; - } - rowLength += maxWidth; - rowLength += cornerSpace; - } - // 删除所有的null - rowNodes.removeAll(nullSet); - } - } - - /** - * 压缩空格 - */ - private void compressNodes(List> nodes) { - if (nodes == null) return; - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - for (int i = rowCount - 2; i >= 0; i--) { - List rowNodes = nodes.get(i); - for (Node node : rowNodes) { - Node left = node.left; - Node right = node.right; - if (left == null && right == null) continue; - if (left != null && right != null) { - // 让左右节点对称 - node.balance(left, right); - - // left和right之间可以挪动的最小间距 - int leftEmpty = node.leftBoundEmptyLength(); - int rightEmpty = node.rightBoundEmptyLength(); - int empty = Math.min(leftEmpty, rightEmpty); - empty = Math.min(empty, (right.x - left.rightX()) >> 1); - - // left、right的子节点之间可以挪动的最小间距 - int space = left.minLevelSpaceToRight(right) - MIN_SPACE; - space = Math.min(space >> 1, empty); - - // left、right往中间挪动 - if (space > 0) { - left.translateX(space); - right.translateX(-space); - } - - // 继续挪动 - space = left.minLevelSpaceToRight(right) - MIN_SPACE; - if (space < 1) continue; - - // 可以继续挪动的间距 - leftEmpty = node.leftBoundEmptyLength(); - rightEmpty = node.rightBoundEmptyLength(); - if (leftEmpty < 1 && rightEmpty < 1) continue; - - if (leftEmpty > rightEmpty) { - left.translateX(Math.min(leftEmpty, space)); - } else { - right.translateX(-Math.min(rightEmpty, space)); - } - } else if (left != null) { - left.translateX(node.leftBoundEmptyLength()); - } else { // right != null - right.translateX(-node.rightBoundEmptyLength()); - } - } - } - } - - private void addXLineNode(List curRow, Node parent, int x) { - Node line = new Node("─"); - line.x = x; - line.y = parent.y; - curRow.add(line); - } - - private Node addLineNode(List curRow, List nextRow, Node parent, Node child) { - if (child == null) return null; - - Node top = null; - int topX = child.topLineX(); - if (child == parent.left) { - top = new Node("┌"); - curRow.add(top); - - for (int x = topX + 1; x < parent.x; x++) { - addXLineNode(curRow, parent, x); - } - } else { - for (int x = parent.rightX(); x < topX; x++) { - addXLineNode(curRow, parent, x); - } - - top = new Node("┐"); - curRow.add(top); - } - - // 坐标 - top.x = topX; - top.y = parent.y; - child.y = parent.y + 2; - minX = Math.min(minX, child.x); - - // 竖线 - Node bottom = new Node("│"); - bottom.x = topX; - bottom.y = parent.y + 1; - nextRow.add(bottom); - - return top; - } - - private void addLineNodes(List> nodes) { - List> newNodes = new ArrayList<>(); - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - minX = root.x; - - for (int i = 0; i < rowCount; i++) { - List rowNodes = nodes.get(i); - if (i == rowCount - 1) { - newNodes.add(rowNodes); - continue; - } - - List newRowNodes = new ArrayList<>(); - newNodes.add(newRowNodes); - - List lineNodes = new ArrayList<>(); - newNodes.add(lineNodes); - for (Node node : rowNodes) { - addLineNode(newRowNodes, lineNodes, node, node.left); - newRowNodes.add(node); - addLineNode(newRowNodes, lineNodes, node, node.right); - } - } - - nodes.clear(); - nodes.addAll(newNodes); - } - - private static class Node { - /** - * 顶部符号距离父节点的最小距离(最小能填0) - */ - private static final int TOP_LINE_SPACE = 1; - - Object btNode; - Node left; - Node right; - Node parent; - /** - * 首字符的位置 - */ - int x; - int y; - int treeHeight; - String string; - int width; - - private void init(String string) { - string = (string == null) ? "null" : string; - string = string.isEmpty() ? " " : string; - - width = string.length(); - this.string = string; - } - - public Node(String string) { - init(string); - } - - public Node(Object btNode, BinaryTreeInfo opetaion) { - init(opetaion.string(btNode).toString()); - - this.btNode = btNode; - } - - /** - * 顶部方向字符的X(极其重要) - * - * @return - */ - private int topLineX() { - // 宽度的一半 - int delta = width; - if (delta % 2 == 0) { - delta--; - } - delta >>= 1; - - if (parent != null && this == parent.left) { - return rightX() - 1 - delta; - } else { - return x + delta; - } - } - - /** - * 右边界的位置(rightX 或者 右子节点topLineX的下一个位置)(极其重要) - */ - private int rightBound() { - if (right == null) return rightX(); - return right.topLineX() + 1; - } - - /** - * 左边界的位置(x 或者 左子节点topLineX)(极其重要) - */ - private int leftBound() { - if (left == null) return x; - return left.topLineX(); - } - - /** - * x ~ 左边界之间的长度(包括左边界字符) - * - * @return - */ - private int leftBoundLength() { - return x - leftBound(); - } - - /** - * rightX ~ 右边界之间的长度(包括右边界字符) - * - * @return - */ - private int rightBoundLength() { - return rightBound() - rightX(); - } - - /** - * 左边界可以清空的长度 - * - * @return - */ - private int leftBoundEmptyLength() { - return leftBoundLength() - 1 - TOP_LINE_SPACE; - } - - /** - * 右边界可以清空的长度 - * - * @return - */ - private int rightBoundEmptyLength() { - return rightBoundLength() - 1 - TOP_LINE_SPACE; - } - - /** - * 让left和right基于this对称 - */ - private void balance(Node left, Node right) { - if (left == null || right == null) - return; - // 【left的尾字符】与【this的首字符】之间的间距 - int deltaLeft = x - left.rightX(); - // 【this的尾字符】与【this的首字符】之间的间距 - int deltaRight = right.x - rightX(); - - int delta = Math.max(deltaLeft, deltaRight); - int newRightX = rightX() + delta; - right.translateX(newRightX - right.x); - - int newLeftX = x - delta - left.width; - left.translateX(newLeftX - left.x); - } - - private int treeHeight(Node node) { - if (node == null) return 0; - if (node.treeHeight != 0) return node.treeHeight; - node.treeHeight = 1 + Math.max( - treeHeight(node.left), treeHeight(node.right)); - return node.treeHeight; - } - - /** - * 和右节点之间的最小层级距离 - */ - private int minLevelSpaceToRight(Node right) { - int thisHeight = treeHeight(this); - int rightHeight = treeHeight(right); - int minSpace = Integer.MAX_VALUE; - for (int i = 0; i < thisHeight && i < rightHeight; i++) { - int space = right.levelInfo(i).leftX - - this.levelInfo(i).rightX; - minSpace = Math.min(minSpace, space); - } - return minSpace; - } - - private LevelInfo levelInfo(int level) { - if (level < 0) return null; - int levelY = y + level; - if (level >= treeHeight(this)) return null; - - List list = new ArrayList<>(); - Queue queue = new LinkedList<>(); - queue.offer(this); - - // 层序遍历找出第level行的所有节点 - while (!queue.isEmpty()) { - Node node = queue.poll(); - if (levelY == node.y) { - list.add(node); - } else if (node.y > levelY) break; - - if (node.left != null) { - queue.offer(node.left); - } - if (node.right != null) { - queue.offer(node.right); - } - } - - Node left = list.get(0); - Node right = list.get(list.size() - 1); - return new LevelInfo(left, right); - } - - /** - * 尾字符的下一个位置 - */ - public int rightX() { - return x + width; - } - - public void translateX(int deltaX) { - if (deltaX == 0) return; - x += deltaX; - - // 如果是LineNode - if (btNode == null) return; - - if (left != null) { - left.translateX(deltaX); - } - if (right != null) { - right.translateX(deltaX); - } - } - } - - private static class LevelInfo { - int leftX; - int rightX; - - public LevelInfo(Node left, Node right) { - this.leftX = left.leftBound(); - this.rightX = right.rightBound(); - } - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/Printer.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/Printer.java" deleted file mode 100755 index 9f91e23..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/Printer.java" +++ /dev/null @@ -1,32 +0,0 @@ -package com.xhp281.printer; - -public abstract class Printer { - /** - * 二叉树的基本信息 - */ - protected BinaryTreeInfo tree; - - public Printer(BinaryTreeInfo tree) { - this.tree = tree; - } - - /** - * 生成打印的字符串 - */ - public abstract String printString(); - - /** - * 打印后换行 - */ - public void println() { - print(); - System.out.println(); - } - - /** - * 打印 - */ - public void print() { - System.out.print(printString()); - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/Strings.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/Strings.java" deleted file mode 100755 index 402e957..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/printer/Strings.java" +++ /dev/null @@ -1,19 +0,0 @@ -package com.xhp281.printer; - -public class Strings { - public static String repeat(String string, int count) { - if (string == null) return null; - - StringBuilder builder = new StringBuilder(); - while (count-- > 0) { - builder.append(string); - } - return builder.toString(); - } - - public static String blank(int length) { - if (length < 0) return null; - if (length == 0) return ""; - return String.format("%" + length + "s", ""); - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/test/Main.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/test/Main.java" deleted file mode 100644 index 4ffe765..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/test/Main.java" +++ /dev/null @@ -1,216 +0,0 @@ -package com.xhp281.test; -import com.xhp281.Person; -import java.util.Comparator; -import com.xhp281.tree.BinarySearchTree; -import com.xhp281.printer.BinaryTrees; -import com.xhp281.tree.BinaryTree; - - -/** - * User: FenDou - * Date: 2019-05-20 10:58 - * Description: - */ - -public class Main {// 创建比较器 - private static class PersonComparator implements Comparator { - @Override - public int compare(Person e1, Person e2) { - return e1.getAge() - e2.getAge(); - } - } - - private static class PersonComparator2 implements Comparator{ - @Override - public int compare(Person e1, Person e2) { - return e2.getAge() - e1.getAge(); - } - } - - /** - * 利用创建比较器方式比较 - */ - static void test1(){ - Integer data[] = new Integer[] { - 7, 4, 9, 2, 5, 8, 11, 3, 12, 1 - }; - BinarySearchTree bst1 = new BinarySearchTree<>(new PersonComparator()); - for (int i = 0; i < data.length; i++) { - bst1.add(new Person(data[i])); - } - BinaryTrees.println(bst1); - - - BinarySearchTree bst2 = new BinarySearchTree<>(new PersonComparator2()); - for (int i = 0; i < data.length; i++) { - bst2.add(new Person(data[i])); - } - BinaryTrees.println(bst2); - } - - /** - * 匿名函数方式比较 - */ - static void test2(){ - Integer data[] = new Integer[] { - 7, 4, 9, 2, 5, 8, 11, 3, 12, 1 - }; - BinarySearchTree bst = new BinarySearchTree<>(new Comparator() { - @Override - public int compare(Person e1, Person e2) { - return e2.getAge() - e1.getAge(); - } - }); - for (int i = 0; i < data.length; i++) { - bst.add(new Person(data[i])); - } - BinaryTrees.println(bst); - } - - /** - * 默认函数方式比较 - */ - static void test3(){ - Integer data[] = new Integer[] { - 7, 4, 9, 2, 5, 8, 11, 3, 12, 1 - }; - BinarySearchTree bst = new BinarySearchTree<>(); - for (int i = 0; i < data.length; i++) { - bst.add(new Person(data[i])); - } - BinaryTrees.println(bst); - } - /** - * 打印数字 - */ - static void test4() { - Integer data[] = new Integer[] { - 7, 4, 9, 2, 5, 8, 11, 3, 12, 1 - }; - - BinarySearchTree bst = new BinarySearchTree<>(); - for (int i = 0; i < 30; i++) { - bst.add((int)(Math.random() * 100)); - } - BinaryTrees.println(bst); - // 写入文件操作 -// String str = BinaryTrees.printString(bst); -// Files.writeToFile("/Users/FenDou/Desktop/fileTest/1.txt",str); - } - /** - * 覆盖方式测试 - */ - static void test5(){ - BinarySearchTree bst = new BinarySearchTree<>(); - bst.add(new Person(10, "p1")); - bst.add(new Person(9, "p2")); - bst.add(new Person(30, "p3")); - bst.add(new Person(30, "p4")); - - BinaryTrees.println(bst); - } - - /** - * 遍历测试 - */ - static void traversalTest(){ - Integer data[] = new Integer[] { - 7,4,2,1,3,5,9,8,11,10,12 - }; - BinarySearchTree bst = new BinarySearchTree<>(); - for (int i = 0; i < data.length; i++) { - bst.add(data[i]); - } - BinaryTrees.println(bst); - // 前序遍历 -// bst.preorderOrder(new BinarySearchTree.Visitor() { -// @Override -// public boolean visit(Integer element) { -// System.out.print(" " + element + " "); -// return element == 10 ? true : false; // 停止条件 -// } -// }); - // 中序遍历 - bst.inorderOrder(new BinarySearchTree.Visitor() { - @Override - public boolean visit(Integer element) { - System.out.print(" " + element + " "); - return element == 10 ? true : false; // 停止条件 - } - }); -// // 后续遍历 -// bst.postorderOrder(new BinarySearchTree.Visitor() { -// @Override -// public boolean visit(Integer element) { -// System.out.print(" " + element + " "); -// return element == 10 ? true : false; // 停止条件 -// } -// }); -// // 层序遍历 -// bst.levelOrder(new BinarySearchTree.Visitor() { -// @Override -// public boolean visit(Integer element) { -// System.out.print(" " + element + " "); -// return element == 10 ? true : false; // 停止条件 -// } -// }); - } - - /** - * 遍历测试 - */ - static void toStringTest(){ - Integer data[] = new Integer[] { -// 7,4,2,1,3,5,9,8,11,10,12, - 7,4,9,2,5 - }; - BinarySearchTree bst = new BinarySearchTree<>(); - for (int i = 0; i < data.length; i++) { - bst.add(data[i]); - } - - BinaryTrees.println(bst); - System.out.println(bst); - System.out.println("高度: " + bst.height()); - System.out.println("是不是完全二叉树:" + bst.isComplete()); - -// System.out.println(bst.predecessor(2)); - } - - /** - * 删除测试 - */ - static void removeTest(){ - Integer data[] = new Integer[] { - 7,4,2,1,3,5,9,8,11,10,12, -// 7,4,9,2,5 - }; - BinarySearchTree bst = new BinarySearchTree<>(); - for (int i = 0; i < data.length; i++) { - bst.add(data[i]); - } - - BinaryTrees.println(bst); -// bst.remove(1); -// bst.remove(3); -// bst.remove(10); -// bst.remove(12); - bst.remove(11); - BinaryTrees.println(bst); - } - - /** - * 主函数 - * @param args - */ - public static void main(String[] args) { -// test1(); -// test2(); -// test3(); -// test4(); -// test5(); - traversalTest(); -// toStringTest(); -// removeTest(); - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/tree/BinarySearchTree.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/tree/BinarySearchTree.java" deleted file mode 100644 index d5446fd..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/tree/BinarySearchTree.java" +++ /dev/null @@ -1,194 +0,0 @@ -package com.xhp281.tree; -import java.util.Comparator; - -/** - * User: FenDou - * Date: 2019-05-17 13:53 - * Description: 二叉搜索树 - */ - -public class BinarySearchTree extends BinaryTree { - - private Comparator comparator; - - /** - * 初始化方式 - */ - public BinarySearchTree(){ - this(null); - } - public BinarySearchTree(Comparator comparator) { - this.comparator = comparator; - } - - /** - * 添加 - * @param element - */ - public void add(E element){ - checkElementIsNull(element); - - // 添加第一个节点 - if (root == null){ - root = new Node<>(element,null); - size++; - return; - } - - // 父节点 - Node parent = root; - // 添加其他节点,首先找到父节点 - Node node = root; - // 比较结果 - int cmp = 0; - while (node != null){ - // 比较大小 - cmp = compare(element,node.element); - // 获取父节点 - parent = node; - // 新元素 > 父节点:去右边查找 - if (cmp > 0){ - node = node.rightNode; - // 新元素< 父节点:去左边查找 - }else if (cmp < 0){ - node = node.leftNode; - }else{ - // 相等直接返回 - node.element = element; - return; - } - } - // 判断是设置为左子树还是右子树 - // 获取新节点 - Node newNode = new Node<>(element,parent); - if (cmp > 0){ // 右 - parent.rightNode = newNode; - }else{ - parent.leftNode = newNode; - } - size++; - } - - /** - * 是否包含 - * @param element - * @return - */ - public boolean contains(E element){ - return node(element) != null; - } - - /** - * 检测是不是为空 - * @param element - */ - private void checkElementIsNull(E element){ - if (element == null) { - throw new IllegalArgumentException("element must be not null"); - } - } - - /** - * 比较大小 - * @param e1 - * @param e2 - * @return 返回值等于0:e1 = e2 返回值大于0:e1 > e2 返回值小于0: e1 < e2 - */ - private int compare(E e1,E e2){ - // 有判断条件的时候使用判断条件 - if (comparator != null){ - return comparator.compare(e1, e2); - } - return ((Comparable)e1).compareTo(e2); - } - - -// ================================= 删除操作 - public void remove(E element){ - remove(node(element)); - } - - /** - * 删除节点 - * @param node - */ - private void remove(Node node){ - if (node == null) return; - size--; - // 度数为2的节点 - if (node.hasTwoChildren()){ - // 找到后继节点 - Node sNode = successor(node); - // 用后继节点的值覆盖度为2的节点的值 - node.element = sNode.element; - // 删除后继节点 - node = sNode; - } - - // 删除node节点,度为1或者0 - Node replaceElement = node.leftNode != null ? node.leftNode : node.rightNode; - // node 是度数为1的节点 - if (replaceElement != null){ - // 更改父节点 - replaceElement.parent = node.parent; - // 更改 parent 的left,right指向 - if (node.parent == null){ - root = replaceElement; - }else if (node == node.parent.leftNode){ - node.parent.leftNode = replaceElement; - }else{ - node.parent.rightNode = replaceElement; - } - }else if(node.parent == null){ - // node 是叶子节点并且是根节点 - root = null; - }else{ - // node 叶子节点但不是根节点 - if (node == node.parent.leftNode){ - node.parent.leftNode = null; - }else{ - node.parent.rightNode = null; - } - } - - } - - /** - * 根据内容获取节点 - * @param element - * @return - */ - private Node node(E element){ - Node node = root; - while (node != null){ - int cmp = compare(element,node.element); - // 相等的时候返回 - if (cmp == 0) return node; - // 输入值大于当前节点,从右面找 - if (cmp > 0 ){ - node = node.rightNode; - }else{ - // 输入值小于当前节点,从左面开始找 - node = node.leftNode; - } - } - return null; - } - -// // ================================== 打印方法 -// -// @Override -// public String toString() { -// StringBuilder sb = new StringBuilder(); -// toString(root,sb,""); -// return sb.toString(); -// } -// private void toString(Node node,StringBuilder sb,String prefix){ -// if (node == null) return; -// sb.append(prefix).append(node.element).append("\n"); -// toString(node.leftNode,sb,prefix + "L --> "); -// toString(node.rightNode,sb,prefix + "R --> "); -// } - - -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/tree/BinaryTree.java" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/tree/BinaryTree.java" deleted file mode 100644 index 2afc763..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/tree/BinaryTree.java" +++ /dev/null @@ -1,319 +0,0 @@ -package com.xhp281.tree; - -import com.xhp281.printer.BinaryTreeInfo; -import java.util.LinkedList; -import java.util.Queue; - -/** - * User: FenDou - * Date: 2019-05-21 19:03 - * Description: 二叉树基类 - */ - -public class BinaryTree implements BinaryTreeInfo { - - /* 大小 */ - protected int size; - /* 根节点 */ - protected Node root; - - public int size(){ - return size; - } - - public boolean isempry(){ - return size == 0; - } - - public void clear(){ - root = null; - size = 0; - } - - - /** - * 节点对象 - * @param - */ - protected static class Node{ - public E element; - public Node rightNode; - public Node leftNode; - public Node parent; - - public Node(E element, Node parent) { - this.element = element; - this.parent = parent; - } - - /** - * 是不是叶子节点 - * @return - */ - public boolean isLeaf(){ - return leftNode == null && rightNode == null; - } - - /** - * 拥有两个节点 - * @return - */ - public boolean hasTwoChildren(){ - return leftNode != null && rightNode != null; - } - } - - /** - * 判断是不是二叉树 - * @return - */ - public Boolean isComplete(){ - if (root == null) return false; - Queue> queue = new LinkedList<>(); - queue.offer(root); - - // 是不是叶子节点 - boolean leaf = false; - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 如果不是叶子节点返回false - if (leaf && !node.isLeaf()) return false; - - if (node.leftNode != null){ - queue.offer(node.leftNode); - }else if (node.rightNode != null){ - return false; - } - - if (node.rightNode != null){ - queue.offer(node.rightNode); - }else{ - leaf = true; - } - } - return true; - } -//======================================= 获取节点 - /** - * 获取前驱节点 - * @param node - * @return - */ - public Node predecessor(Nodenode){ - if (node == null) return null; - // 前驱节点在左子树中 - - Node p = node.leftNode; - // 左子树不为空 node.left != null - if (p != null){ - // 循环遍历右子树 - while (p.rightNode != null){ - p = p.rightNode; - } - return p; - } - - // node.left = null && parent != null - while (node.parent != null && node == node.parent.leftNode){ - node = node.parent; - } - - // node.parent == null && node == node.parent.right - return node.parent; - } - /** - * 获取后驱节点 - * @param node - * @return - */ - public Node successor(Nodenode){ - if (node == null) return null; - // 前驱节点在右子树中 - - Node p = node.rightNode; - // 右子树不为空 node.right != null - if (p != null){ - // 循环遍历左子树 - while (p.leftNode != null){ - p = p.leftNode; - } - return p; - } - - // node.right = null && parent != null - while (node.parent != null && node == node.parent.rightNode){ - node = node.parent; - } - - // node.parent == null && node == node.parent.left - return node.parent; - } - -//======================================= 使用访问器接口进行遍历 - /** - * 访问器接口 - * @param - */ - public static abstract class Visitor{ - /* 是不是停止 */ - boolean stop; - /* 如果返回false停止遍历 */ - public abstract boolean visit(E element); - } - - /** - * 前序遍历 - */ - public void preorderOrder(Visitor visitor){ - if (visitor == null) return; - preorderOrder(root,visitor); - } - private void preorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - visitor.stop = visitor.visit(node.element); - preorderOrder(node.leftNode,visitor); - preorderOrder(node.rightNode,visitor); - } - - /** - * 中序遍历 - * 二叉搜索树的遍历结果是可以控制升序还是降序 - * 升序:中序遍历左子树、根节点、中序遍历右子树 - * 降序:中序遍历右子树、根节点、中序遍历左子树 - */ - public void inorderOrder(Visitor visitor){ - if (visitor == null) return; - inorderOrder(root,visitor); - } - private void inorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - inorderOrder(node.leftNode,visitor); - if (visitor.stop) return; - visitor.stop = visitor.visit(node.element); - inorderOrder(node.rightNode,visitor); - } - - /** - * 后序遍历遍历 - */ - public void postorderOrder(Visitor visitor){ - if (visitor == null) return; - postorderOrder(root,visitor); - } - - private void postorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - postorderOrder(node.leftNode,visitor); - postorderOrder(node.rightNode,visitor); - if (visitor.stop) return; - visitor.stop = visitor.visit(node.element); - } - - /** - * 层序遍历 - * @param visitor - */ - public void levelOrder(Visitor visitor){ - if (root == null|| visitor == null) return; - - Queue> queue = new LinkedList<>(); - queue.offer(root); - - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 判断是不是要返回 - if (visitor.visit(node.element)) return; - if (node.leftNode != null){ - queue.offer(node.leftNode); - } - if (node.rightNode != null){ - queue.offer(node.rightNode); - } - } - } - -// ===================================== 计算二叉树高度 - /** - * 方式1 - * 获取树的高度,非递归方式 - * @return - */ - public int height(){ - if (root == null) return 0; - - // 树的高度 - int height = 0; - // 每层的数量 - int levelSize = 1; - - Queue> queue = new LinkedList<>(); - queue.offer(root); - - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 访问的时候数量减少 - levelSize--; - - if (node.leftNode != null){ - queue.offer(node.leftNode); - } - if (node.rightNode != null){ - queue.offer(node.rightNode); - } - - // 遍历完一层,将要遍历下一层的时候获取下一层的数量 - if (levelSize == 0){ - levelSize = queue.size(); - height++; - } - } - return height; - } - /** - * 方式2 - * @return - */ - public int height2(){ - return height(root); - } - - /** - * 递归方式获取高度 - * @param node - * @return - */ - public int height(Node node){ - if (node == null) return 0; - return 1 + Math.max(height(node.leftNode),height(node.rightNode)); - } - -// ================================= 二叉树打印接口设置 - @Override - public Object root() { - return root; - } - - @Override - public Object left(Object node) { - return ((Node)node).leftNode; - } - - @Override - public Object right(Object node) { - return ((Node)node).rightNode; - } - - @Override - public Object string(Object node) { - // 获取父节点内容 - Node currNode = (Node)node; - String parentString = "null"; - if (currNode.parent != null){ - parentString = currNode.parent.element.toString(); - } - return currNode.element + "(" + parentString + ")"; - } -} diff --git "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/\344\272\214\345\217\211\346\240\221.md" "b/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/\344\272\214\345\217\211\346\240\221.md" deleted file mode 100644 index 2e9a446..0000000 --- "a/\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/src/com/xhp281/\344\272\214\345\217\211\346\240\221.md" +++ /dev/null @@ -1 +0,0 @@ -# LL - 右旋转(单旋) \ No newline at end of file diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/.classpath" "b/\345\212\250\346\200\201\346\225\260\347\273\204/.classpath" deleted file mode 100644 index 51a8bba..0000000 --- "a/\345\212\250\346\200\201\346\225\260\347\273\204/.classpath" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/.gitignore" "b/\345\212\250\346\200\201\346\225\260\347\273\204/.gitignore" deleted file mode 100644 index 173454b..0000000 --- "a/\345\212\250\346\200\201\346\225\260\347\273\204/.gitignore" +++ /dev/null @@ -1,9 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### Example user template template -### Example user template - -# IntelliJ project files -.idea -*.iml -out -gen diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/.project" "b/\345\212\250\346\200\201\346\225\260\347\273\204/.project" deleted file mode 100644 index 0cf8a5a..0000000 --- "a/\345\212\250\346\200\201\346\225\260\347\273\204/.project" +++ /dev/null @@ -1,17 +0,0 @@ - - - 动态数组 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/.settings/org.eclipse.jdt.core.prefs" "b/\345\212\250\346\200\201\346\225\260\347\273\204/.settings/org.eclipse.jdt.core.prefs" deleted file mode 100644 index 3a21537..0000000 --- "a/\345\212\250\346\200\201\346\225\260\347\273\204/.settings/org.eclipse.jdt.core.prefs" +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/ArrayList.class" "b/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/ArrayList.class" deleted file mode 100644 index 21a68fa0bc531d3abe9147c2613860b7492ea01b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4381 zcmbtXX;WM089i4E65@hE2E0flvLQAIY!aHrDVqZrJG2-a3*%rX#uw=VvV|lI2`}B8 z){X0CUz*g;r!;P9X53EGX~B)B>Bmev`4gRKJJWXZpELeKNwixxyWohb}=d6(xo z=RC`M`QzswegxoA-15Mop)Q(Q=)5$a?i|QujLW0(#jFP|4YlWtC8IN8B_? ztOnO&{EDeT8`0o36Xt@M%r0u!dU|x@(jEj804s z4ICR78kv~VP(74NE@q8ncG5`XOeazK2xxe8_~`K1#Przs#Ps3u6Jv**Yy8nr(Hl?3 zv;8#KI?^`D+fXWI`rt&pj#@NmaJIHhRzkxz9Ugc!Y#EIw&9U6VjG37*W)g(rA5BG# z#H5jl%ey`3%Ff4y$Y_}oMD2|lX(JntUe?f9y7_W?-N5$poxP;o&+XNbtPwqb)JQ8| zK7!jNVCyuvqY2Z<2;3GOZdCZN2dy6LEs;KQc`<7)=x7sqj=3n+k1L*xfhWFbE~K*r zM&767JsC4Ejn8UmXe|#(8+TN+5>?xXNYoF9nA6d0NLs*bP8OieBwGqUDTKK`3ZM6;Hx z%Idg|AspgR##~4(k()1-%Z|?urgF)c2N4a;1r0}3xboAB! zGx6lyU@o4BnHeumvbxmXP<%1u!vv-zqZq0ZeAcF(Ho}^~GdiBd8NxEsX){TQf~BD< z@zCSNSpx3}Nx854m=Oz1zkS82weF)RUZs}Ax2a19p486F)kk#6I%EK|3vkkq>meV0|d{y?pwjl%l%YK!uMDhj=JSzZL4HYxWtcLBI zq>OS%*pXB&6EzRVrC-#?*JJxEc#;wEq+xg7=yloEXaCdW2M<>z8~lPR%2X?TEr?`PB0mb#jmh6p~cttNQIcu&^aJ$*UfGL`NhP~ko3vQYvcZTV0@RNRqB%($14(90{%+ot) z)2p{L!J=oyLe^XKWR=j9_^Yzqrb#~>!f2l1QN{2KnM=rhiX1a|Y-2B)r;hQWfJ^7K z`kzlhu>x)ZkU0y0%t-=jI98Tsf3Q{UD+>M5zy>|fik_N?+kAWN?;@$CXY3RO)gm2| zB39KuK!!k)M$-)E1-9%Ad0$|4ETIP%i}dWvL+`Wo)bWT)5(f{DpsJ^0J!QSnu~x0? z$rk+?>O62#Qipu(kfe0Fb3`Cgw%o(A(t3`=?i62opZ9AhwG6-*a7Y zBfMH9a7!L#i;c2SQ8Fip9P%Na_iI(HKkyE!tX>bVNE$LM|g*er~R*RUP2VSixh+8&oMwv zR&-Wyv7lQRK6-kU{$3-8HyGzPc}%}WRo-T{yv6o%lO6mPEBYP9O*$ZvK?96t>QbQ?JD=aOIn4LTfz5Ew)?*?H#xAng11oDF6sokR`7$9%V@H8y=3iD z!>=$^Wkcb-`=s6fy0Wx_Hw*Q*pC4iXKdA5?Lb%Pd>?b_fe~O2(%=-Hov+8|3&9Nx% zutt8abh6rU%GSwCGC!o68vj%7R!TUEl#o^HO6YKXh7J#|YIQp#>))nl2Y#eZRtIkW E2eC;0eE3;tH_5;96Y`Mq?l%nJ?nD$4(>+x8n z#)Tu`4djswhB7_~KJ*4EG6K0>9c%MSV5#2d2sm$&eO15`mW#+DCr}P`to9~{J(ad) zZ>R+PFp1=_BU5ehebF&}J!XUO|E^6s8Z~Agr`~OJTs#n1TMY4b8mW=dNu0+TTisrs z-kpEG{qptK@!8$YNdX?Jc8qm_YCT-YS|-);L9@}Zj7LR0o((!;(X@<=KDARBanS6M z98Q=;mmhQWAB(@8IpOL|^j?nc-%@BLlQdHAw0-T$e0@8%JGQ_*amPT0C+>&QB?_1Y zb9Vb0`HR_gfze)rf)&Q%oWQ(Fw2TtUtXQ!oBg0&&ox%SO@1yTuqjD3zxWdDWnW{v# tN0#;U;V|Y{ap}Olv14Lqg#84>@7Jr|xs_?$3<%|9wpZjt~1 diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Main.class" "b/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Main.class" deleted file mode 100644 index a766ed8d7b16033388d6c82b35e35c1ff749efc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1360 zcmZ`(T~8B16g^Wuwp|t|1u7sQh)7G33W6ULQ3Sza`G^<{@o8ySSkmq`+l9cB|G*dD zO?=ZweE=hgKfoVlJhR(EE0`uT_s+fd?A&wD^!J~izW_{OLqR}5%i4wH(OxmRs+*RA zdV%o1eyAt&y0x2J-`O{^u0Z3gX_@YvKwT`pB~ZU$=L{8f2x(|Qqd;rMw2ZZb!j9p* z)_3xTKqO;l_57CZn9?sF*1LOVNuVWD{mm5d3jDS}H1;-g@$F65F|FNHd`m%_KwG6` z-f{Hfj9GG3gb`BFfvAE`CR|jeE!WsJ91YjdC7>MY`2%D9oy1Sat3FUpOG%&}4cF1j z{`6c};cf*7FU&^3{n;0Tg$slthvGf&*mybdi#)yL3HS}*Dmt3Qu zA%-~d>;vL;`lY6w+#o$JNiy_;*Fr+W814uJUE8Nlpd(h@Z<$aPNlYlXE70yyRtu$J z68A`2QKIKLlo~FoW-`q=R%WtcI3?Q(;(xKf(BvrCD!U!f!h^VAK4=lVMr z6Gf;Ny)LA*c&NE+~oz!H{;8^mY4K$wf{Bi#CA( diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Person.class" "b/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Person.class" deleted file mode 100644 index c1486de53b8105b99c228dafde542901ff6f4d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmZuvYi|-k6g>mj1-gJN&{|uSswf~7-!J;m8cj%uZ9+rR7(Xnq!Zxr=mPM<-N{yw7 zCjJ0_l<~|$gNWH=_RidU&bhB&zrX(ka38x0d;-y?-76h;`lWrt8Q7MBfWY}9{k>l5 z>Q=k7*Elkou7F=}8v>#t5U}(fO|3c&s=1D7waWqvo2F&D+X743%Dg{UC;ElmGQ#j9 zq9TMSiL<$S2-H+@4hz!KR451v#HyxcydL%%hI61dx}K)p)Vp=vG39;o7;ro0fcWZc zAmq_XpLxw?#4 zS8)~B*b2ShH>{SxTDCH;JrOAfkr7Y|Y1vax;HHFU1&aR@nA4onL85dam zJJZs;<|no-{PMVI^j*`o1`2KqB&H=FbR7GGY^EH^T@^({LtKrA3Lea?LG9zfHF_!@ z;W0;M54jPkaW>r8wWrD8`mRq0EjuEmUN z_Rwh>uS_}h#WCB4%o^)l5I@(~$B+BsS=<)>{q%$o=DEn*A^kEgmOq7>Up=8wI6?f2 z2T1VL5a7vmCpaWmkSmKQYo{aD;DdeL78$6NO^JIa{53C$&tEae>|AyEI zY3=$5H)zNC({emUxb>MNK1lHe!a+$XsCss0A{dY(VAKXZ0eVVaH9MXx5MecUzT%$t cWQ6jxmZ+C=f`BCHQh(7#CbR<2Na(}!Kg&YRnE(I) diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/ArrayList.java" "b/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/ArrayList.java" deleted file mode 100644 index 8cf39e3..0000000 --- "a/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/ArrayList.java" +++ /dev/null @@ -1,175 +0,0 @@ -package com.xhp; - -public class ArrayList { - /** - * 元素数量 - * */ - private int size; - - /** - * 所有元素 - * */ - private E[] elements; - - // 默认大小 - private static final int DEFAULT_CAPACITY = 10; - // 未找到 - private static final int ELEMENT_NOT_FOUND = -1; - - /** - * 构造函数 - */ - public ArrayList(int capaticy){ - capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy; - elements = (E[]) new Object[capaticy]; - } - public ArrayList(){ - this(DEFAULT_CAPACITY); - } - - /** - * 清除所有元素 - */ - public void clear(){ - for (int i = 0; i < size; i++) { - elements[i] = null; - } - size = 0; - System.gc(); - } - /** - * 获取元素数量 - */ - public int size(){ - return size; - } - /** - * 是否为空 - */ - public boolean isempty(){ - return size == 0; - } - /** - * 判断元素下标 - */ - public int indexOf(E element){ - if (element == null){ - for (int i = 0; i < size; i++) { - if (elements[i] == null) return i; - } - }else{ - for(int i = 0; i < size; i++){ - if (elements[i].equals(element)) return i; - } - } - return ELEMENT_NOT_FOUND; - } - /** - * 根据下标获取元素 - */ - public E get(int index){ - checkRange(index); - - return elements[index]; - } - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - checkRange(index); - - E old = elements[index]; - elements[index] = element; - return old; - } - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - - // 容量检查 - updateCapaticy(size + 1); - - for (int i = size; i > index; i--){ - elements[i] = elements[i - 1]; - } - elements[index] = element; - size++; - } - /** - * 插入尾部 - */ - public void add(E element){ - add(size,element); - } - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - - E old = elements[index]; - for (int i = index; i <= size; i++){ - elements[i] = elements[i+1]; - } -// size--; -// elements[size] = null; - elements[--size] = null; - return old; - } - - -// 工具类 - /** - * 抛出错误 - */ - private void outOfBound(int index){ - throw new IndexOutOfBoundsException("Index is " + index + ", size is " + size); - } - /** - * 检查范围 - */ - private void checkRange(int index){ - if (index < 0 || index >= size){ - outOfBound(index); - } - } - private void cheakAddRange(int index){ - if (index < 0 || index > size){ - outOfBound(index); - } - } - private void updateCapaticy(int capaticy){ - int oldCapaticy = elements.length; - if (oldCapaticy >= capaticy) return; - // 扩容为1.5倍 - int newCapaticy = oldCapaticy + (oldCapaticy >> 1); - E[] newElements = (E[]) new Object[newCapaticy]; - // 移动之前元素 - for (int i = 0; i < size; i++){ - newElements[i] = elements[i]; - } - elements = newElements; - System.out.println(oldCapaticy + " 扩容为: " + newCapaticy); - } - - /** - * 打印字符串 - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(elements[i]); - }else{ - buffer.append("," + elements[i]); - } - } - buffer.append("]"); - return buffer.toString(); - } -} diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Assert.java" "b/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Assert.java" deleted file mode 100644 index 7846ef7..0000000 --- "a/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Assert.java" +++ /dev/null @@ -1,11 +0,0 @@ -package com.xhp; - -public class Assert { - public static void test(boolean value){ - try{ - if (!value) throw new Exception("测试未通过"); - }catch (Exception e){ - e.printStackTrace(); - } - } -} diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Main.java" "b/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Main.java" deleted file mode 100644 index ec5fb8d..0000000 --- "a/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Main.java" +++ /dev/null @@ -1,31 +0,0 @@ -package com.xhp; - -public class Main { - - public static void main(String[] args) { - // TODO Auto-generated method stub - ArrayList list = new ArrayList<>(); - list.add(10); - list.add(11); - list.add(12); - list.add(13); - list.add(14); - list.add(null); - list.add(0,99); - list.set(0,100); -// System.out.println(list.remove(5)); -// list.set(20,100); -// Assert.test(list.get(0) == 9); -// list.clear(); - System.out.println(list.toString()); - - ArrayList personList = new ArrayList<>(); - personList.add(new Person(10,"Robin")); - personList.add(new Person(11,"Robin1")); - personList.add(new Person(22,"Robin2")); - personList.add(null); -// personList.clear(); - System.out.println(personList.indexOf(null)); - System.out.println(personList.toString()); - } -} diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Person.java" "b/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Person.java" deleted file mode 100644 index 510d528..0000000 --- "a/\345\212\250\346\200\201\346\225\260\347\273\204/src/com/xhp/Person.java" +++ /dev/null @@ -1,22 +0,0 @@ -package com.xhp; - -public class Person { - private int age; - private String name; - - public Person(int age, String name) { - this.age = age; - this.name = name; - } - - @Override - public String toString() { - return "Person [age=" + age + ", name=" + name + "]"; - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - System.out.println("Person - finalize"); - } -} diff --git "a/\345\223\210\345\270\214\350\241\250/.gitignore" "b/\345\223\210\345\270\214\350\241\250/.gitignore" deleted file mode 100644 index 10f5518..0000000 --- "a/\345\223\210\345\270\214\350\241\250/.gitignore" +++ /dev/null @@ -1,6 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -# IntelliJ project files -.idea -*.iml -out -gen diff --git "a/\345\223\210\345\270\214\350\241\250/.idea/misc.xml" "b/\345\223\210\345\270\214\350\241\250/.idea/misc.xml" deleted file mode 100644 index 0548357..0000000 --- "a/\345\223\210\345\270\214\350\241\250/.idea/misc.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/\345\223\210\345\270\214\350\241\250/.idea/modules.xml" "b/\345\223\210\345\270\214\350\241\250/.idea/modules.xml" deleted file mode 100644 index a93844b..0000000 --- "a/\345\223\210\345\270\214\350\241\250/.idea/modules.xml" +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git "a/\345\223\210\345\270\214\350\241\250/.idea/vcs.xml" "b/\345\223\210\345\270\214\350\241\250/.idea/vcs.xml" deleted file mode 100644 index 6c0b863..0000000 --- "a/\345\223\210\345\270\214\350\241\250/.idea/vcs.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/\345\223\210\345\270\214\350\241\250/.idea/workspace.xml" "b/\345\223\210\345\270\214\350\241\250/.idea/workspace.xml" deleted file mode 100644 index 9374783..0000000 --- "a/\345\223\210\345\270\214\350\241\250/.idea/workspace.xml" +++ /dev/null @@ -1,610 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Visitor - traversal - table - put - put : - node - compare - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1559626465725 - - - 1559642320476 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/FileInfo.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/FileInfo.class" deleted file mode 100644 index 8f0ef213aa42f532ecb3a5b4c2d4287dae330419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1527 zcmZ`(Sx*yT6g^*;ndvZWm9i93i!9TrrLu@@qChYqsrrB+L85VJ2N*0fO&QeqV~jt* z2TfQKO?>phzhq*(w;f7TrZ3-i&pr3tW#-SnAHM+1U`0g-vI-_*Xh%-LeHD|K;>$EI zGcq2iP%x|DA@6g%%*$Aiu_zEN*^YHAAU5c{XP5Xa7hK1)98VygKQ!N)xsvJZ=Qh2H z?d+3_v}8NBw=59W(^~?OHMeL9bmocZ`N`3)Re5Rdmgps(cME1|%dFUZ_a7tPflVQj z`GR|t`*={Enw!jV*xXZEHk>_|HGOa^MFJ)C^iGffW#94`P7snn!j0 z1Yx6pROxl?GPfQ*9Yn4YypBoe*C9+VndP$O6a{AW)`_HBo2Y6w6wLh&&;x4 z9(B__sT3^Ej*OQzncyyH=s`jN8sfMipzgdev!7P7uU=1G}VH}S&Ji&-Sf2(E)bY1bh*gdogG!zX_wV9xf9hXZsnZ|?a71+aU z5b|2FebF=%is#mXAw@IYL4zMgh*PCgi1V)QR2kZ15L_!-d+9b$b}Ad%j0*@O9y&w# zdllSAt4c*8r#$+I!kY<;CzwUKo{Bg31yqd-~zF@dX6?SglRj6 zMoJ7$BwU?~Vfxboqi7@1{S%W@M(6g{oi$fE%nVcFPu@Q5LjEK9a=SdHYiJ!Y6uW=1ZD zZBnWH0-G$d@g|#81wn->FIn(KEGXc#q!1?=Sj@fM_uf8z?qmAJ>%WcwOyav9q%o>Q zNk=crI>s=r#DtC!6m?w2q=qkaBvDSHqV$v!(>i7_t77If%xk!!;Y)$!zG)9z&bBKs zRIR%Y$_KlRiRtn3wq?um62&roa{?z-oID7m<6Exd3!J`J-81*ivTZs$<@La`oE?TG z<}Jqxh&z^hKU&Di{Dwem(cO{)>8j<()#ihm^lqCqo0d$~t(*3S=~-&uHO7Kni!_X7 z$C2KmZTi0Cb};l-e|TJRGwXHP2n0^$I@B$rFyMt*;~>R5G55-HL!vuvM{iU zH3fW&hr$}oA_?^V1GiS&lXX@r(>8T$MdE=1KNi>Ny+Ae;lx_8-xh1gBE&B0!2^)ma z26l%qnp1OP94Ey3?Z{xE=DT(?khj_$=*#89I+(Kj>z2oyT<-?~VzKRK!bq#z)VMSn z(joK82Sz#nA-ba>DgU2Yw_zO6WZ?c?%p`C2H!U?!*)SARFNN9PPlpdgn$HENACcZ( zHCq5R$BVB@gkL`f=sm;L4EIs$bYbK%M4|W?k-`&1|7ZseQYILvo}wX2qrFb!BYeW0 zz^6Fdff0QK(P;Z+q=ncDMf?%^3x7fsDI!miXhGXN#Gcwc$EH$8zhX`4)zPC$ELw?Y zJE+CuS4HXGq?8f}V`tLTZqwQ!N-RoOpx`&xqnvoa`X>{1g|5Z=N4Afn)aQ z@8lAN;$K3FvVu6K$bXuQXK0({pEZXX=HcK9zUTfSf0v)J*v_+n82tsD!+GYFA z`96Sy_)88sX1pVcS7k9paYmlv8WK8o;hZd%hFKkZFeit34M`2x6pYby+RBZj%zWO; zE4Ys&(@FcNf}^|VqJncIldu#T#*%4kV&TS&m76kWQj|1}W#VS)qM1v|xh!i&qXHfTrxd3)Kk@HG(DRU zyA=J4(`{xXnzGUgYE+?SCa2I^(n)3_#};O1t(=uOPoGwfC~om?QO94=5n`2lMHkJL ztI;zj7UNddPG-`=K;qz*Bq4>J&mvospHT>Iqk3#1nJV$9o3zdN^>H&>Oq+)5Yzp=R zTY+_DBe0+f!&P#0c^l}n)8}STSRa*+jPI$6j;Tbk6syLfNoik`O=*ueYPZ{Py~`B30K z5;q?U9bX6Bj|w;vOghJn^qsxR~C zE6Yj0+_ob1NMp;0vbDQ=wl@h|-^^yMG;0~I2E5H;vsXQHmMzF^9ljAbWS)FQ;Orh1 z?`{s@oITG}C9ITXTO;#kZkS=U@%kCau6QbwC*wLZk(gY_W^)$bKxEjum0_iLL*l6+ z%U6Y6oSvzi8K<$(D>h__*v6xs*+`^Lx+9r12Y`&+)?zYmmqNLuFwp(B7{ClXzcJ1tPW72-Uo20dn>4kEyFRk0w;IZ_zK)H!fF#L>Rf>*7G8!o z>QYg6&{cpQi)w3V>kDcH)HWGhrbD3u>YP^#s9#$Dy{~|VL!M^O_b~dJJzjXt#1s8 z5W@);urqWIwYbUm#2tP(BbdY8^8Phb`vaEnBhPp74dna)zv4HZyKo;5%ljXc|BZj} zi06m+6LJoy2GzuGucKJHD`=stktJ+GJ$wkjPlRR`%}VqSO<4fU-V(g+UyE zi#UJb1^(V}(B6p`afs~LD75OQeZAU^!+4o(6j04%G{m+$LisWR?sa<5G`ynWsD@WH zyryAT!!fR4)O&gJFMRx^GF*F#%W3|vGfMp_7GkDE*||<1t|zo0-@D=3lUzzbjWD*U zkQak2!#D)SQPF`A8*vt=;&^E)@EyZ<(q>>|Dt5^fw2iX`c7MBNPA2+RuqPG{Eu+1F zj_L3{+LTJTlf?rQjrMQ{JpThhR6Xzj diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/Map$Visitor.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/Map$Visitor.class" deleted file mode 100644 index 8bee94697e1987eea56bf91c7c912a69d4e4d234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmaJ;!A`1c6R2?n>RbNAD?gU0M2ocM;f~_YBKg2q%iV)2KK;^)rBjfHbc7EGAYyX z9&LuAAzb@zIvLnOpAQ^D%7$lg$K-*C<0U9XBM~ylrU*sk1q_87*R_L=!^6;~MBT8w ziTX71&n`~Y3HQ}o?l+cXjiI`#`Rsq|HvXy8`(3SXYHg~|%;LTbM@?hQXIyo-J5=un zW7~?fB+{a3m7W;7JemeHk)#e!iWSo#ac0NYNJpjE;m1*%bNIfozVVE4t%c=J*xtg`6}Lve`LUL7x1= qf`Bz_P*hw&N~FrLi867vD3d~k6c*k#s&ixq>vZRdk-{DdlJW%}{)=h= diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/Map.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/Map.class" deleted file mode 100644 index bf1279ad74c1e115b2e0db214951a55752a453a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmaJ<%TB^T6g>llQXYyZKJbAWqp-2jxFD9WF`5uCE+AdF8=DE1^p&;{_0wGV0e+P6 zQXVmsxR~CaIp?0a_s)F(e0~AA!KsX@jAI!m46<$pX6X71`L^Q-|IXq;AOZ#{Fh2xC zvQ}@C$_(ypFMN;iGegR-1g9Kgb^3avkfBlQ4*8g?7Iy~f)5}m8p%&k%$F~@io;h%M zIP&ShT&>^H`np!9Mb-mB*5@m%R~ls|$fLjdJTGw!G_3hQWZd|E0_tZ!3oy|t6O=fcOpQ1T!u@xzs z&CYFnDEf-MR$RuA?YSf05D%tB#b&6C%gHS;l;Q<46qj#^p%T~48%Z-TB#6Mv?ccvDwrO_tu-goc2ednC}?yUWK`3k^kTnyuQ1UgQ% zp&cj1oDy?d%o#Cf#hi=KjEFfO#)U9O6@qitl0qy!Yc85e$1KbwZ%oZvxeAZkCheJm zSy^x`mSrZGX<0O#1ux1n(j05LLU+A*mpT1vp!&1#Z_cuFF5iOG)9TP~`p2-s>R5D$wz)ef8=oDQAb&JWAU9c--3YQc0 z0vcqRQ5win%D5+`BW)L~>kIQ!mYXrB9Eyvji#gNDnyxKzHK|qdHkHOVpDmUCoDU~_ z8ULhI;6rvfZJE>Tc4C0)woO*d+#GvW#f#?6a^_xfJa0R9*$ahssh_TR2|j>bzA3$` zhT*b3<=BN8h2F$KGYV|-(dHE!o+Fi-xKQ8NY=hibeVIaJvbf;ptSh!ORj-c3u*@F& z*!XpH>_tk)9`xwghNzD1V!9F6u|rIkm<0ND44_}3r|~V`*eP`WJ?37ov*_a|q4Pru zaS;Rx9oz-bNlUz19Aiw>TD+Sv32cfVAEdp>SBw2!|tFEeOOe$;C$-1FiZ%t6Knl`hOsf4B!CJQh`||%_1_r4}lr0iel=T_U(e?oCzOdG1 zhLKtrURKMj@!u`Zmw@_;u=<7$^&N5b1N+s_4J7*N6ieohVhw?gXmxIeY7=w}!$b%m OiCy#&a%$(=iO6rBzA8Nc diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/TreeMap.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/TreeMap.class" deleted file mode 100644 index 2836f230624e843cee485a5e118bfd2d75a59030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10011 zcmcgx3wTslo&TMAWRjUX2_X;&kTg&TVJ0Dk2E-(UK%i?&lD2?Qveso1E@WUb6J{nr z@lox|)?IDY+TGNOt*s5MtU`sv!Y*xhUC^$N>Zd^qdFm>)ij%gd)r zID1-V=VW$XhQE^GuVw9m4A1!RtRLk#9l&$=8yWsqhR?{izmwr&2~xP^=kQsf`8h%U zynOh3LG*c zv?FQT-I1ZCLaSAwWP5afJdz$xa@(>(ux&fGw(i*3+RiP0B?WHj!=2-p<&u+or5$MiSKW^zVCqDpKdiQLpJuD7GrPFG5oD@BAt!{V!;1HRO+eeJ&xoKeTp@|q`3W0iK z^A%=!zs;R>Gw?bCXLM;YC;QFjqNF{TI7}7-{fT%w5{;*}3S)C;!bW`+>7Amu47ekt z_t5Ymk)%A&L^lrG!{W;8rmnSJ#@5>Rvj%Ucus_r!cebt|$&z$3a@bC$A~7HSmD<@E zO+~e*Ur|35pTv>#S$l`?a0Yf!Ay9>-1wLmPQ&?VzVir!^u5B9Rq&P1?PBY$BaC??g z0W?_{;iiQCw&l=pB*q}64AcB_`idytb$FEwtGU0P9>+gfT~&~^)){<{`Hyr1NqZ<3 z>9+^9!-ooD$uX}zJusBC_uBn-DkTZ-RaCoTs!}E?p1d%^UZZ*oqRR3}^`wUTGu#Ct z`_guDn-g8N1;x~+4wxLUiMlz+L=dz0F{*v3XkRQE->*<#5JQ#;u`(?)&9VhWV2p-z zU>8zZmIU*MmhA>fk>24rQzoDLlacsdGHgl^S6-ukF)6!j@h{u>7mFEl6IUzjnD&vL zM7n1<7V8|aMK3cZCdzCQ6DQvOL`=M6eL;P-_P&}zx(n{lDx)x-EEtnFU6-=@GGWhPC$TU{hIPX~}Xx?QTyDC;RPd zq7nm^lVMg$^jWwD*URun7CN!n!g{n@*nkcT58^}Y!V0v1vh7C}-j6@E(2Ly`K8Ob_ z{8;wBM}|L^wVQFDg#o-%VUCV=-RQARJ819iil)-6ofcli0Snu(-NH}sQwwj!+bkq; z%)-B6orQmw*Z&ZZp9#o4xXZ$u1pm8*@Z)&Y!XvWwpYru#nT^VakI9E8WcE>+eHh0r zyca+B;TIWJbgSd^oNNv){1X4Auq2n1u8qa){gK$lusm^vP zc%QlCjp569UT^cS$kYk+@90Wph~bI?i9u6Ojuod~eNrZ{r#xM1NzD5N@NMZ{j+` zC;PqyHJmf5IKF`p*YLaIvnZs-p-yw=#A4*$_sysBgzsl2a7Nu21r>Z=c zUO8{bHj->hksz@etBTIT8byho1oJqlD$;zAbED@ty#-iFJ*=V^uBP8#jip$_8;7-A zZRJ}VV`4qW4V1fsn%IaNu!)Jk6MsU_kJ2-TsPe=7`c_)*RzloCZQVzI{U9NaGr>Pb z3w?r`JA<3Fp0}Zxd&>B>n_8p}9gWM31w|WeOv(s#eKl^EtWRfqJ>JHu(m}r4a13u| zGVPZqE7Yrz}I;@y+QyD5uz6Y&~so48jzY94$mUq;Y}KK`ld z(zz3;;mqpBq{h0mo!uR`3Rth?bN{0%f0eOjF&E~9G`^*0m$o3$Ql&6ce6 z6^`^p2x>`PTB;nBkwu_H76T<2NVv7&nm{@E>+oTp!{UBI4P;sDB{dfz{UOccIA#fF z`9a*Txyt1P$wiVAj7?_F7ls#;FN9tc2OO0|`4oDkn%u?9MEF1+&C;wUN~h73Z$^Ik zCh|K`Z*^qS)j=-CGUQc&qIpQZ_dLpXk7IUsgM{7FsBmFd!_%0f*ywEFWUj)q@b!ek zjkMP|Do5b;oa8)s5v2|CG+Q{coE6Kg`jZt>dUbg2{J?j(LcMCB+a*Gei#4 zlt<|B$F#U1a#qJ+6L*$`-J2D>SGzsWFbtbPVlys~gBOQ2@J1N|zlU-g_yplaEoE@O zgk}Z<{h|D~yu&p1IYhuDh6yD3e2A#TK4sxcOpH23(Rb%biZt$Oipi}Evv;5r@60n) zS(e{2N_K>3bIu{(3~%!7D8C6uZm3M)+(N4C@*FP4`AI}-4x5mfKO)S8srLpl!x+*F z4P5Z^f9V*icF9*uzUEk6pyT~^M!}t!i@R9)-o>1LH?zk*nr#z9%~`gawd$ofG;0C! zBTb-;00Om%0vM>H6|C&+NbCzr*SWyB8Ibg2;+qMG~dqg-vvCw>>wRlGs9pBX5%&|WS`3#>^aAm z0<2zA(Ojf=j8#iQTTGYRX@XaF8Y9Y1@h`JejA(WWoOs$oSVa?PWI_*iGLk2-kmFpR zuVSvx#kX|vu0?udcuG3Mc?`bzHH~N(iZ&4+zF{8ArmApfd)>}eYx)HNehp^r$A#8R^2pf25sU?jqMS0l- zN*K&RcZZrlK$&b-$CWj%c~{nQsC9z;Uhd}AkrU)!C2gr$P13qacrOoyX+SwJwO2m~ zZ^NnT8l+T6sbyepjvIjGS!KY+Cnj}(Ml4rDySMc zSx6FX%BY4j(*b)ax+p0>lL?f`WCA69se#I5vT}GQ;H9J!Bp&!JJT6Dl_Yn=R(2S(& z0Y1GXdS51}GeNEcPkJJHWqnVGGFCJ87!o|~F=Q&8h~%3Smn8zpG_c%c1Iqx6nl{{c z_mvC_`uHf88klmEP_*Oo%;=yLm@9K}(8ucv{z6Puc2SkxC{sO{rM6L>Z$ypSg?jqU zRcbfZs$R6IH(`^y8J#ME>r@|ZRQ>2xHuk7}u+;$K>Hvn-LB>Z6x2rhrQA3Q6q&9<; zOX?x3{QDfg^io%H5OgskCt2{Nyw=c8Tol;)S&Wwl7N67?c z(MZKFVFe%jtMnJo@n%|9@k(BDa+JpT1KckTQbVtFUqqQa!aPZ=aN}h7S%f$ZyVzPx z>Z8>W_|#GQfH?t}ey%1fWext^>H2Eez)bG?1jucq#w%7Llsse(s+mh5110u$ zbW-GS^AUpcdf4G+7kP1Uvo92OvnEYB0;_jx`UbNvYaO3MKSx!*8JoyAp}LVsU2G*? zaw|QZ7%S#9V(hu8p_5XnT(a+@Y?dQ;8|^@W;xe;&!{`pwBVvsQV@R@|8p z^)XW8WxGRNPW?i?Omaz`=i!-;`^65gx%3fM&yQlEdQ>y0D=d#P8T~BMSxz$9JSPYG zc@#Op%x8`mIe6of0&g;(z)R*c@RIqApWaJu`6I~;-1Edh5j6Kf;hv|i8M%L)+>es` z6XgC0a{nZ`|M(w}d;XZ>aQ`BoqWccHCD6xFT>$mjleeTiK`vmOTRmbRG}h4CDIPo1o|4}Ix7&{s diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/Set$Visitor.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/Set$Visitor.class" deleted file mode 100644 index 788bf84b0ae3420d630b81553d6e8d774eaff032..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmaJ;O;5r=5Pe%p3$+TOpdubjJb(uqjRzxy#1KqO8a+Tbcw6cQmXwyX3(=qD$;5*{ zz#nCt0v?d)VQ1gGdGodV`Stz*;1Wj`QrI_9HgU+H$10pKutx@?Ap@zJ45@0ZN0C8p$0M2eOHx-u88etY8A}yL4E9|Rh^XcBI2IJBxL!DR zo`;i*t8*t7%IOGovJ}@DN~<+rCO>tL|H*4~+w~?Tr)No1hGNwn@fmk~9t@m^{z!PL zUZcgb9XSZNnnpCdQKh7WtTx)$>+8g{9|0u@o3Gke&i+aiUA1K4`@8v?m}P5=M^ diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/Set.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/Set.class" deleted file mode 100644 index fdff30cc9acc2c53e878c19c9503c62b85056ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546 zcmaJ;O-}+b6r8dP%OWbG_<6RZOFA2n!(ocO)ywq zvqvhayVIF@P5C23J_rRT4^@W@#UPFhml3&YUVp+D+z)v)_V1r2A~3Bc8Qg&!N8HR6 zwJdlK-Sp7nqtPE0>iQ!~HcCw61sPqV_(CYnLxwZ2AH-At<#~2_ec@|i{DCly#WHWcNM+~JwJXe9ZlOcsE(tYR2tPIs`5{An9J22F;^hZOWH!*|Ky8_ z)5Hh=0RJfCxuq;nCJFbR^WE>9^YQhTKYxGy25^7_9Z8hs@-mGSUZt^yZ4DI-HHP&m zx64z@w*uGGu*0BrX9S{Akq;SC!O-%{ zdklp*uj2_pT**1I94k0xcvJZwDUL4=sdgFE6Zb+eWLlOZ&L^Xu@H)I_6OwDWeQtNT zXURMQRVj+081EWMDmO?}e!1{!JTFd$wlHj0T9*5GxfGLaCk8B2q{zuS}l?Nnv1$ed~BZa@!ayGTdR(#dAjXRyuNs6 zNn4EQr|wEk41r9^CSTq<^`EA(6smFp`B5 zy&NfeSrXZ-^Z=lp43P+ZH;@5CmZFc8E3{{7^=q)&&NULXpHRLLq~I>CDIx-U$kCb) zi!-=~`;<{p*pk#zY=pe|8QFn{#Fiua(Fncv9f|r6s9y-RuJPMoY zC{mON$IK)wvmO&`lX@ob1ZosL#a4)v@Qij9&+!6jii$L44Rz?M{QH=FQmD%OAG|#G AumAu6 diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/TreeSet.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/TreeSet.class" deleted file mode 100644 index fcdbda00f827caf6114820003afb9d75b870d0f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2140 zcma)6ZBG+j5IwgoENvG>Q1C%~6h$npQc)j8+Xr6|e53OGu>_3b}NyDd+*N7J!j_3-2VLa?FWF%SV`d^t{J$VLJZfEIDkSLMf@+z zf-E;=xhcynS#BFxOd*Xs^08!K*}z=`_Y}DEd8fI*0FTd()y`nwB zk9J=BP;Xs5{)an~spOSt*dIyDtnMoqc4Mhp_dYbgUn%sJE821u2Ff+ZvuuYs9LYrM zn_;M-E4r#3Pb!EAKs?e>gbX){j$0cWf54(RewZ9wU9D|1y`<+_+uChd6$6szn%%Iy z8Z$eQ>8_7@Oa< zhh}MNPT-%In8mYBj!=-oP<(1+J7O<)5dVtAXZqs!hpYS=0wxl~9B-Zka|p*U!TorL z>z_c9weHowU#?R)L(N3p*W5+DwA7#5#Xu|~z+@A2)DH^;-~~+MEK?GB_k1FS@5|8V zH*|)lEOG&%MRA32ut}(Pk&NR-cP-QG=GhSKV4HR@LMuL>R(yN3=SX|LP5XwV%_#}$ zOvR$CITm#;#A>!#%?PXbd{*&wvd&^ID0UNlP1X@%{f_j@Y;FhUE(T+f_Fdp3xDp~C yX_JrOA})0(Ek2)Ie3#ow|3__o&9C4pHI88(hq#Z^p5`upc|ME_i6oy@QTE^F5R9V$ diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$1.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$1.class" deleted file mode 100644 index a4d2b4b6cbf5b6e8db23868945faef4df1dfe2cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1224 zcmaJ=T~8B16g@*rw_UeTTaXVyP%E_MV=1DbMG&ecBt=ayB>G~e?W8PjcbnZQk^kh2 zK9ocg!?Qoic&A;$Le-bKGk5Mi_uO-5e*OOb6Tli?=orFW0`tge$m@t;PA!Ev7L;97 z%aV>|m>O0z6m=xAs^OuAM+~t|%dzAZLnN0!WQdmCx?mWtSdMtzZdQf&j#q8+q$_TX z+lSn<)H!fQ<&otx7<-N*yt2)GU(hjAsku$_^HFPcqi9Ou%WSd4FnD75mSo7~D#!eU zn>KeE=7IDqr%?)d_8ci1!Yk!J5T#GzR8{VaS7_XB6Rk|>@*ezeOGE2X5P|iC31=FQJ53R-KT# zFP)n0`qcTpkVkG^!(#*MNEsMLO2dYMCwR&*cD?W2wq@6aXP|^l2KG^Ho*CG}wua{h zcCgEkx}L;v^U@VaWMB;AbkR2_4P}POko#Km#65JWTB1=XQ@mRF)R&@319aOIFxpeh za?Q6iZAqdD-Xwiuywws;ona|Fu0Yd#pUgq`lz1inVwnGlk4v|Q$}p1a2PVW!SE8#7 z=|QvG5LOFE=RAQe{VdkxXY1bsWGiGq}-ok^CF9W0!IeWlF+(zM39&Ix2_ zZ}b8%f?IT=7l3hERWc_q1vm2z13wUXe}?En2ZQMtEsGs!9mG3GM7~f+4^}4&+{QGf zy3n(|^Z=TGFoDT#xfzO@!a!<=%1sC5)`N1%!ooT9#dF-~z_jM6Smw31|jIEl1|nP}n<%P<;c diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$2.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$2.class" deleted file mode 100644 index 07051ff83e28ab5f163f0d46a52f78a4bc363425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1224 zcmaJ>QBM;=5dM~yUVC1lwjhWis0b}B94#nl5rwJ=Nl_CFiN2Vn-L!|-yXJ07Wdd46#kivE&v*B%3>6h*sRXU>L1hj(FW^9SZLqKeQ>5uDUgD zA8^l7`yd#VP0MF6b{$7}6`T9MplzmFb6e);X1laeG^Oz6T&c`3d~EraWXNW#NBo$Z zHg_84zVs}oQ4U3R9Vr^ZE9X8CrBC8SRUXJ!Xx#1)txV|f{3^pjxW=2qBTV(vN z>C|l3r_T3;Y`S#~j|{9MWndI34I2g?;|asW)xLK+mR%Q~figB3*hjT^YG4b`G(0!3 zjU9&6)k_T5FG7Jt1|~2`2Lp4`P+^z~g|9SE+(U<|B^rftrOTC1d?{KqK(|8)<9)>} z*L+LUmL!_sEz&2(+il_08J5E13N+0P$Q*P}7cb?X5A#3yaq0F^8OE}Mz=W9TNpzVZ zeGqNM*LJ9dzcHlek`Ad6NQD)8UL*7{LC+3qq9CPdWs+y)hZj%5zS3d{X|l0iu!sz; zjeY{gaD#UA1z?h_y37eo!OeWb&<{l3pCX#?VmKWmQ|LnLBHl$J@`Y0RusV5Q71Q*C zP|&me>j5+Y;U=bfNzWT^JYOgPfBAa1?iX6lQU^ c=kMV@`6%Y_0OPbu6Rjk9AWkB!VJ4dR0}z}V$N&HU diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$3.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$3.class" deleted file mode 100644 index 77804546564afcba114820be5904b0fa78e9553d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 873 zcmZWnO>fgc5Ph3CS!@hV99p1!Lx6lh9S8@cRuv@zsZyYof^y*IxT|C?di%sNJ-$-z4xJM-qv^Zx$x<0pU@=s4iGW#cyPIJk>@9QPfR@qnYw@ra?k zBbC&<48=xs$YAy2Bf+rNmrA^!O-Ca65R4+qc>OpGqG6Co6X!`wPh`sA?kgpdUKFIM zps>~tLQmo&j>j$i>KIPs4Q>iqJk7Hz(qRCS@IQJ^4)m>E@6!#+5=TO zP4gaA7s%S*P-vf_So}i49KgvgUenB82C^|P%t5FH9%^8fJ%YQE!*!`9gKM>a!8$|f oKin!GJBPBco(;WzjHFb{rkf; z0Bi86fglDn>@ncMfR2X@wBq3z7{p#3`*aLx*l)mx0bzPX#{mtG>NsfNF+A?W6L?a? zAp;E})Dq*cfe1##H(NYL4UFNij;Jsn5s#xfVj@>ugCq7zXh<4ZC@>r|&?YuYA*~@} zU`cV3HPDW64aYT{P+;~uj-A>Xv(jlht)O;8)QM(#6?g;fLkiTbi4j{tT{!C4yR-3O zJGIvuj?v-|Cn8pC$Vx@U+%>A1!%^mF2uBj}(22vzuI|oI#!hE?6x4{ZlWF5tQo$_Q zgO<=PD@mv3%A_ZgrNli|{5OP;SmRbGW;tV_!AvUZjP*#CekWs(*{Po1(%xOf5J_a6 zjDp50ehQQ*Km7{y(P+%>cSaKm=E~a&bEwZ<6IqWZQX{Ok@t~B>1)^Z)V8)6ZWmyGk zG@R71NyAfYlFP+va*?))rh*GvLW8y-EFkagnyZv7>Qm!Zlxdp-Rgj1#daV?38iR>! zDq@QY6!=6tRtf@5EXN84ODz)(*_*O$q9-L06HntAVmI+Do}uohF{g ziwb6k_NDDqI@D)7+Y;H3P*7+GcT!M4y<@~KOd4J?F@cvgykg=sUS*Eyo?Eif*od8? z6mMKOeLbJMasJysPoMki$4e$&!|UYN#2YvxCTC5&iE|p>GVwOvVZinL7k^wnb@Q_` zj41@XD;)2~dtCed?D?DDoRyND#|4&ldv{kyCf>)HDm7D8GIOF&f;qNO!v`iV;!>5M z)q<#xO!Nuj>!#6I!P3C+5j#SS%#oZbbjX7!Es4eznx>6gv8+8XDn!xWF6py$EGUX( zmWjIq(qeHp`4qVpIfH8w5=vR)?6Vcq@Ua4ID4LFD670}|3hBC-7Q4$mLXb@o=5jfd zsG72^5e1uNQ0|GUCT;nIl+%cl%QGQM?PNM*$60YgRNPc7IGPCU;hm9TdfSRKpw>zz zZHK$BsIt3EKoO9uM+WL+c19d3;^&>o3uIm;<#+gJ5=9e_e&Ei;%-C3vUnN2koD_It zJm^i;5Rz7bL|oKF(iCW~!Wa?KMZr=z!TDsg(0wvp z3vOJ67UoJ?n5Gq8z|!KhU@YRVSdhQDKn)aeiSfCTvk*r`Sc6xge8(>yntq_2 z-7Gqw6J4C?SX~aj3~ymAoQLPYRd{y>{c6o5YNk-@#r~jQ)1`@CUn|YDdTA{WAH$6) z%9@D?z%LgV*F?l=og{BJ`u@ytdqTCfuf%Gh*lUMsQ`aBv4!0&I&VOB7QrW~4cn4QBMX|1KWHn+S+$GgLl z!#p~4Tq`fTob2-U&hNPPIl7m3%w2|C{RNtO1xAaS!vggXsadZImln0i z-h@}Va_iUSc`PKdMP+K#0yS$flZCXQj&CU)Sc>gfhA;vcWser z*}O@tD^RwEBur2b_hCI$B+ZRQb5yWonYH;*=!bdM0r6c&3B^y}_enwLhc zXwPE_1C~xSVi<3xpzsvI`MDEgY>^G5n<`4#fKfN zvWQU#T$~1V5`o)?LA;!T(O&wOGSY`UZKB 0) { - this.files += info.files; - this.lines += info.lines; - this.content = new StringBuilder(this.content) - .append("\n") - .append(info.content) - .toString(); - } - return this; - } -} diff --git "a/\346\230\240\345\260\204/src/com/xhp281/file/Files.java" "b/\346\230\240\345\260\204/src/com/xhp281/file/Files.java" deleted file mode 100755 index b74d2d2..0000000 --- "a/\346\230\240\345\260\204/src/com/xhp281/file/Files.java" +++ /dev/null @@ -1,72 +0,0 @@ -package com.xhp281.file; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileFilter; -import java.io.FileReader; -import java.io.IOException; - -public class Files { - - /** - * 读取文件内容 - * @param file - * @return - */ - public static FileInfo read(String file) { - if (file == null) return null; - FileInfo info = new FileInfo(); - StringBuilder sb = new StringBuilder(); - try (FileReader reader = new FileReader(file); - BufferedReader br = new BufferedReader(reader)) { - String line; - while ((line = br.readLine()) != null) { - sb.append(line).append("\n"); - info.setLines(info.getLines() + 1); - } - int len = sb.length(); - if (len > 0) { - sb.deleteCharAt(len - 1); - } - } catch (IOException e) { - e.printStackTrace(); - } - info.setFiles(info.getFiles() + 1); - info.setContent(sb.toString()); - return info; - } - - /** - * 读取文件夹下面的文件内容 - * @param dir - * @param extensions - * @return - */ - public static FileInfo read(String dir, String[] extensions) { - if (dir == null) return null; - - File dirFile = new File(dir); - if (!dirFile.exists()) return null; - - FileInfo info = new FileInfo(); - dirFile.listFiles(new FileFilter() { - public boolean accept(File subFile) { - String subFilepath = subFile.getAbsolutePath(); - if (subFile.isDirectory()) { - info.append(read(subFilepath, extensions)); - } else if (extensions != null && extensions.length > 0) { - for (String extension : extensions) { - if (subFilepath.endsWith("." + extension)) { - info.append(read(subFilepath)); - break; - } - } - } else { - info.append(read(subFilepath)); - } - return false; - } - }); - return info; - } -} diff --git "a/\346\230\240\345\260\204/src/com/xhp281/map/Map.java" "b/\346\230\240\345\260\204/src/com/xhp281/map/Map.java" deleted file mode 100644 index d175107..0000000 --- "a/\346\230\240\345\260\204/src/com/xhp281/map/Map.java" +++ /dev/null @@ -1,24 +0,0 @@ -package com.xhp281.map; - -/** - * User: FenDou - * Date: 2019-06-04 15:36 - * Description: - */ - -public interface Map { - int size(); - boolean isEmpty(); - void clear(); - V put(K key, V value); - V get(K key); - V remove(K key); - boolean containsKey(K key); - boolean containsValue(V value); - void traversal(Visitor visitor); - - public static abstract class Visitor { - boolean stop; - public abstract boolean visit(K key, V value); - } -} diff --git "a/\346\230\240\345\260\204/src/com/xhp281/map/TreeMap.java" "b/\346\230\240\345\260\204/src/com/xhp281/map/TreeMap.java" deleted file mode 100644 index 5a4a10f..0000000 --- "a/\346\230\240\345\260\204/src/com/xhp281/map/TreeMap.java" +++ /dev/null @@ -1,492 +0,0 @@ -package com.xhp281.map; - -import java.util.Comparator; -import java.util.LinkedList; -import java.util.Queue; - -/** - * User: FenDou - * Date: 2019-06-04 15:38 - * Description: - */ - -public class TreeMap implements Map { - - private static final boolean RED = false; - private static final boolean BLACK = true; - - private int size; - private Node root; - private Comparator comparator; - - - public TreeMap() { - this(null); - } - - public TreeMap(Comparator comparator) { - this.comparator = comparator; - } - - public int size() { - return size; - } - - public boolean isEmpty() { - return size == 0; - } - - public void clear() { - root = null; - size = 0; - } - - @Override - public V put(K key, V value) { - elementNotNullCheck(key); - - // 添加第一个节点 - if (root == null) { - root = new Node<>(key,value,null); - size++; - // 新添加节点之后的处理 - afterPut(root); - return null; - } - - // 添加的不是第一个节点 - // 找到父节点 - Node parent = root; - Node node = root; - int cmp = 0; - do { - cmp = compare(key, node.key); - parent = node; - if (cmp > 0) { - node = node.right; - } else if (cmp < 0) { - node = node.left; - } else { // 相等 - V oldValue = node.value; - node.key = key; - node.value = value; - return oldValue; - } - } while (node != null); - - // 看看插入到父节点的哪个位置 - Node newNode = new Node<>(key,value,parent); - if (cmp > 0) { - parent.right = newNode; - } else { - parent.left = newNode; - } - size++; - - // 新添加节点之后的处理 - afterPut(newNode); - return null; - } - - @Override - public V get(K key) { - Node node = node(key); - return node != null ? node.value : null; - } - - @Override - public V remove(K key) { - return remove(node(key)); - } - - @Override - public boolean containsKey(K key) { - return node(key) != null; - } - - @Override - public boolean containsValue(V value) { - Queue> quque = new LinkedList<>(); - quque.offer(root); - if (!quque.isEmpty()){ - Node node = quque.poll(); - if (valEquals(value,node.value)) return true; - - if (node.left != null){ - quque.offer(node.left); - } - if (node.right != null){ - quque.offer(node.right); - } - } - return false; - } - - @Override - public void traversal(Visitor visitor) { - if (visitor == null) return; - traversal(root,visitor); - } - private void traversal(Node node,Visitor visitor) { - if (node == null || visitor.stop) return; - - traversal(node.left,visitor); - if (visitor.stop) return; - visitor.visit(node.key,node.value); - traversal(node.right,visitor); - } - -// 私有方法 - private boolean valEquals(V v1,V v2){ - return v1 == null ? v2 == null : v1.equals(v2); - } - - private V remove(Node node){ - if (node == null) return null; - - V oldValue = node.value; - size--; - - if (node.hasTwoChildren()) { // 度为2的节点 - // 找到后继节点 - Node s = successor(node); - // 用后继节点的值覆盖度为2的节点的值 - node.key = s.key; - node.value = s.value; - // 删除后继节点 - node = s; - } - - // 删除node节点(node的度必然是1或者0) - Node replacement = node.left != null ? node.left : node.right; - - if (replacement != null) { // node是度为1的节点 - // 更改parent - replacement.parent = node.parent; - // 更改parent的left、right的指向 - if (node.parent == null) { // node是度为1的节点并且是根节点 - root = replacement; - } else if (node == node.parent.left) { - node.parent.left = replacement; - } else { // node == node.parent.right - node.parent.right = replacement; - } - - // 删除节点之后的处理 - afterRemove(replacement); - } else if (node.parent == null) { // node是叶子节点并且是根节点 - root = null; - - // 删除节点之后的处理 - afterRemove(node); - } else { // node是叶子节点,但不是根节点 - if (node == node.parent.left) { - node.parent.left = null; - } else { // node == node.parent.right - node.parent.right = null; - } - - // 删除节点之后的处理 - afterRemove(node); - } - return oldValue; - } - - protected Node predecessor(Node node) { - if (node == null) return null; - - // 前驱节点在左子树当中(left.right.right.right....) - Node p = node.left; - if (p != null) { - while (p.right != null) { - p = p.right; - } - return p; - } - - // 从父节点、祖父节点中寻找前驱节点 - while (node.parent != null && node == node.parent.left) { - node = node.parent; - } - - // node.parent == null - // node == node.parent.right - return node.parent; - } - - protected Node successor(Node node) { - if (node == null) return null; - - // 前驱节点在左子树当中(right.left.left.left....) - Node p = node.right; - if (p != null) { - while (p.left != null) { - p = p.left; - } - return p; - } - - // 从父节点、祖父节点中寻找前驱节点 - while (node.parent != null && node == node.parent.right) { - node = node.parent; - } - - return node.parent; - } - - protected void afterRemove(Node node) { - // 如果删除的节点是红色 - // 或者 用以取代删除节点的子节点是红色 - if (isRed(node)) { - black(node); - return; - } - - Node parent = node.parent; - // 删除的是根节点 - if (parent == null) return; - - // 删除的是黑色叶子节点【下溢】 - // 判断被删除的node是左还是右 - boolean left = parent.left == null || node.isLeftChild(); - Node sibling = left ? parent.right : parent.left; - if (left) { // 被删除的节点在左边,兄弟节点在右边 - if (isRed(sibling)) { // 兄弟节点是红色 - black(sibling); - red(parent); - rotateLeft(parent); - // 更换兄弟 - sibling = parent.right; - } - - // 兄弟节点必然是黑色 - if (isBlack(sibling.left) && isBlack(sibling.right)) { - // 兄弟节点没有1个红色子节点,父节点要向下跟兄弟节点合并 - boolean parentBlack = isBlack(parent); - black(parent); - red(sibling); - if (parentBlack) { - afterRemove(parent); - } - } else { // 兄弟节点至少有1个红色子节点,向兄弟节点借元素 - // 兄弟节点的左边是黑色,兄弟要先旋转 - if (isBlack(sibling.right)) { - rotateRight(sibling); - sibling = parent.right; - } - - color(sibling, colorOf(parent)); - black(sibling.right); - black(parent); - rotateLeft(parent); - } - } else { // 被删除的节点在右边,兄弟节点在左边 - if (isRed(sibling)) { // 兄弟节点是红色 - black(sibling); - red(parent); - rotateRight(parent); - // 更换兄弟 - sibling = parent.left; - } - - // 兄弟节点必然是黑色 - if (isBlack(sibling.left) && isBlack(sibling.right)) { - // 兄弟节点没有1个红色子节点,父节点要向下跟兄弟节点合并 - boolean parentBlack = isBlack(parent); - black(parent); - red(sibling); - if (parentBlack) { - afterRemove(parent); - } - } else { // 兄弟节点至少有1个红色子节点,向兄弟节点借元素 - // 兄弟节点的左边是黑色,兄弟要先旋转 - if (isBlack(sibling.left)) { - rotateLeft(sibling); - sibling = parent.left; - } - - color(sibling, colorOf(parent)); - black(sibling.left); - black(parent); - rotateRight(parent); - } - } - } - private Node node(K key) { - Node node = root; - while (node != null) { - int cmp = compare(key, node.key); - if (cmp == 0) return node; - if (cmp > 0) { - node = node.right; - } else { // cmp < 0 - node = node.left; - } - } - return null; - } - private void afterPut(Nodenode){ - Node parent = node.parent; - - // 添加的是根节点 或者 上溢到达了根节点 - if (parent == null) { - black(node); - return; - } - - // 如果父节点是黑色,直接返回 - if (isBlack(parent)) return; - - // 叔父节点 - Node uncle = parent.sibling(); - // 祖父节点 - Node grand = red(parent.parent); - if (isRed(uncle)) { // 叔父节点是红色【B树节点上溢】 - black(parent); - black(uncle); - // 把祖父节点当做是新添加的节点 - afterPut(grand); - return; - } - - // 叔父节点不是红色 - if (parent.isLeftChild()) { // L - if (node.isLeftChild()) { // LL - black(parent); - } else { // LR - black(node); - rotateLeft(parent); - } - rotateRight(grand); - } else { // R - if (node.isLeftChild()) { // RL - black(node); - rotateRight(parent); - } else { // RR - black(parent); - } - rotateLeft(grand); - } - } - /** - * @return 返回值等于0,代表e1和e2相等;返回值大于0,代表e1大于e2;返回值小于于0,代表e1小于e2 - */ - private int compare(K e1, K e2) { - if (comparator != null) { - return comparator.compare(e1, e2); - } - return ((Comparable)e1).compareTo(e2); - } - - private void elementNotNullCheck(K key) { - if (key == null) { - throw new IllegalArgumentException("element must not be null"); - } - } - - private Node color(Node node, boolean color) { - if (node == null) return node; - node.color = color; - return node; - } - - private Node red(Node node) { - return color(node, RED); - } - - private Node black(Node node) { - return color(node, BLACK); - } - - private boolean colorOf(Node node) { - return node == null ? BLACK : node.color; - } - - private boolean isBlack(Node node) { - return colorOf(node) == BLACK; - } - - private boolean isRed(Node node) { - return colorOf(node) == RED; - } - - protected void rotateLeft(Node grand) { - Node parent = grand.right; - Node child = parent.left; - grand.right = child; - parent.left = grand; - afterRotate(grand, parent, child); - } - - protected void rotateRight(Node grand) { - Node parent = grand.left; - Node child = parent.right; - grand.left = child; - parent.right = grand; - afterRotate(grand, parent, child); - } - - protected void afterRotate(Node grand, Node parent, Node child) { - // 让parent称为子树的根节点 - parent.parent = grand.parent; - if (grand.isLeftChild()) { - grand.parent.left = parent; - } else if (grand.isRightChild()) { - grand.parent.right = parent; - } else { // grand是root节点 - root = parent; - } - - // 更新child的parent - if (child != null) { - child.parent = grand; - } - - // 更新grand的parent - grand.parent = parent; - } - - /* 节点 */ - private static class Node{ - K key; - V value; - Node left; - Node right; - Node parent; - boolean color = RED; - - public Node(K key, V value, Node parent) { - this.key = key; - this.value = value; - this.parent = parent; - } - - public boolean isLeaf() { - return left == null && right == null; - } - - public boolean hasTwoChildren() { - return left != null && right != null; - } - - public boolean isLeftChild() { - return parent != null && this == parent.left; - } - - public boolean isRightChild() { - return parent != null && this == parent.right; - } - - public Node sibling() { - if (isLeftChild()) { - return parent.right; - } - - if (isRightChild()) { - return parent.left; - } - - return null; - } - } -} diff --git "a/\346\230\240\345\260\204/src/com/xhp281/set/Set.java" "b/\346\230\240\345\260\204/src/com/xhp281/set/Set.java" deleted file mode 100644 index b76db70..0000000 --- "a/\346\230\240\345\260\204/src/com/xhp281/set/Set.java" +++ /dev/null @@ -1,22 +0,0 @@ -package com.xhp281.set; - -/** - * User: FenDou - * Date: 2019-06-04 17:39 - * Description: - */ - -public interface Set { - int size(); - boolean isEmpty(); - void clear(); - boolean contains(E element); - void add(E element); - void remove(E element); - void traversal(Visitor visitor); - - public static abstract class Visitor { - boolean stop; - public abstract boolean visit(E element); - } -} diff --git "a/\346\230\240\345\260\204/src/com/xhp281/set/TreeSet.java" "b/\346\230\240\345\260\204/src/com/xhp281/set/TreeSet.java" deleted file mode 100644 index 13ef205..0000000 --- "a/\346\230\240\345\260\204/src/com/xhp281/set/TreeSet.java" +++ /dev/null @@ -1,55 +0,0 @@ -package com.xhp281.set; - -import com.xhp281.map.Map; -import com.xhp281.map.TreeMap; - -/** - * User: FenDou - * Date: 2019-06-04 17:41 - * Description: - */ - -public class TreeSet implements Set { - - Map map = new TreeMap<>(); - - @Override - public int size() { - return map.size(); - } - - @Override - public boolean isEmpty() { - return map.isEmpty(); - } - - @Override - public void clear() { - map.clear(); - } - - @Override - public boolean contains(E element) { - return map.containsKey(element); - } - - @Override - public void add(E element) { - map.put(element,null); - } - - @Override - public void remove(E element) { - map.remove(element); - } - - @Override - public void traversal(Visitor visitor) { - map.traversal(new Map.Visitor() { - @Override - public boolean visit(E key, Object value) { - return visitor.visit(key); - } - }); - } -} diff --git "a/\346\230\240\345\260\204/src/com/xhp281/test.java" "b/\346\230\240\345\260\204/src/com/xhp281/test.java" deleted file mode 100644 index 331503f..0000000 --- "a/\346\230\240\345\260\204/src/com/xhp281/test.java" +++ /dev/null @@ -1,74 +0,0 @@ -package com.xhp281; - -import com.xhp281.file.FileInfo; -import com.xhp281.file.Files; -import com.xhp281.map.Map; -import com.xhp281.map.TreeMap; -import com.xhp281.map.Map.Visitor; -import com.xhp281.set.Set; -import com.xhp281.set.TreeSet; - -/** - * User: FenDou - * Date: 2019-06-04 16:49 - * Description: - */ - -public class test { - static void test1() { - Map map = new TreeMap<>(); - map.put("c", 2); - map.put("a", 5); - map.put("b", 6); - map.put("a", 8); - - map.traversal(new Map.Visitor() { - public boolean visit(String key, Integer value) { - System.out.println(key + "_" + value); - return false; - } - }); - } - - static void test2() { - FileInfo fileInfo = Files.read("/Users/FenDou/Code/Java", - new String[]{"java"}); - - System.out.println("文件数量:" + fileInfo.getFiles()); - System.out.println("代码行数:" + fileInfo.getLines()); - String[] words = fileInfo.words(); - System.out.println("单词数量:" + words.length); - - Map map = new TreeMap<>(); - for (int i = 0; i < words.length; i++) { - Integer count = map.get(words[i]); - count = (count == null) ? 1 : (count + 1); - map.put(words[i], count); - } - - map.traversal(new Visitor() { - public boolean visit(String key, Integer value) { - System.out.println(key + "_" + value); - return false; - } - }); - } - static void test3() { - Set set = new TreeSet<>(); - set.add("c"); - set.add("b"); - set.add("c"); - set.add("c"); - set.add("a"); - - set.traversal(new Set.Visitor() { - public boolean visit(String element) { - System.out.println(element); - return false; - } - }); - } - public static void main(String [] ars){ - test3(); - } -} diff --git "a/\346\230\240\345\260\204/\346\230\240\345\260\204.iml" "b/\346\230\240\345\260\204/\346\230\240\345\260\204.iml" deleted file mode 100644 index c90834f..0000000 --- "a/\346\230\240\345\260\204/\346\230\240\345\260\204.iml" +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git "a/\346\240\210/.gitignore" "b/\346\240\210/.gitignore" deleted file mode 100644 index 173454b..0000000 --- "a/\346\240\210/.gitignore" +++ /dev/null @@ -1,9 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### Example user template template -### Example user template - -# IntelliJ project files -.idea -*.iml -out -gen diff --git "a/\346\240\210/src/com/xhp281/Main.java" "b/\346\240\210/src/com/xhp281/Main.java" deleted file mode 100644 index 24c8c14..0000000 --- "a/\346\240\210/src/com/xhp281/Main.java" +++ /dev/null @@ -1,22 +0,0 @@ -package com.xhp281; -import com.xhp281.stack.Stack; - -/** - * User: FenDou - * Date: 2019-05-14 18:08 - * Description: - */ - -public class Main { - - public static void main(String[] args) { - Stack stack = new Stack<>(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - while (!stack.isempty()){ - System.out.println(stack.pop()); - } - } -} diff --git "a/\346\240\210/src/com/xhp281/common/AbstractList.java" "b/\346\240\210/src/com/xhp281/common/AbstractList.java" deleted file mode 100644 index 28b71ef..0000000 --- "a/\346\240\210/src/com/xhp281/common/AbstractList.java" +++ /dev/null @@ -1,77 +0,0 @@ -package com.xhp281.common; - -/** - * User: FenDou - * Date: 2019-05-07 18:47 - * Description: - */ - -public abstract class AbstractList implements List { - - /** - * 元素数量 - * */ - public int size; - - /** - * 获取元素数量 - * @return - */ - public int size(){ - return size; - } - - /** - * 是否为空 - * @return - */ - public boolean isempty(){ - return size == 0; - } - - /** - * 是不是包含某个元素 - * @param element - * @return - */ - public boolean contains(E element){ - return indexOf(element) != List.ELEMENT_NOT_FOUND; - } - - /** - * 添加数据尾部 - * @param element - */ - public void add(E element){ - add(size,element); - } - - /** - * 抛出错误 - * @param index - */ - protected void outOfBound(int index){ - throw new IndexOutOfBoundsException("Index is " + index + ", size is " + size); - } - - /** - * 检查范围 - * @param index - */ - protected void checkRange(int index){ - if (index < 0 || index >= size){ - outOfBound(index); - } - } - - /** - * 检测添加的范围 - * @param index - */ - protected void cheakAddRange(int index){ - if (index < 0 || index > size){ - outOfBound(index); - } - } - -} diff --git "a/\346\240\210/src/com/xhp281/common/ArrayList.java" "b/\346\240\210/src/com/xhp281/common/ArrayList.java" deleted file mode 100644 index 9398c6b..0000000 --- "a/\346\240\210/src/com/xhp281/common/ArrayList.java" +++ /dev/null @@ -1,178 +0,0 @@ -package com.xhp281.common; -import com.xhp281.common.AbstractList; - -/** - * User: FenDou - * Date: 2019-05-07 18:28 - * Description: - */ - -public class ArrayList extends AbstractList { - - /** - * 所有元素 - * */ - private E[] elements; - - /** - * 默认大小 - */ - private static final int DEFAULT_CAPACITY = 10; - - /** - * 构造函数 - */ - public ArrayList(int capaticy){ - capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy; - elements = (E[]) new Object[capaticy]; - } - public ArrayList(){ - this(DEFAULT_CAPACITY); - } - - /** - * 清除所有元素 - */ - public void clear(){ - for (int i = 0; i < size; i++) { - elements[i] = null; - } - size = 0; - System.gc(); - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - if (element == null){ - for (int i = 0; i < size; i++) { - if (elements[i] == null) return i; - } - }else{ - for(int i = 0; i < size; i++){ - if (elements[i].equals(element)) return i; - } - } - return ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - checkRange(index); - - return elements[index]; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - checkRange(index); - - E old = elements[index]; - elements[index] = element; - return old; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - - // 容量检查 - updateCapaticy(size + 1); - - for (int i = size; i > index; i--){ - elements[i] = elements[i - 1]; - } - elements[index] = element; - size++; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - - E old = elements[index]; - - // 第一种方式 -// size--; -// for (int i = index; i < size; i++){ -// elements[i] = elements[i + 1]; -// } -// elements[size] = null; - - // 第二种方式 - for (int i = index + 1; i < size; i++) { - elements[i - 1] = elements[i]; - } - elements[--size] = null; - - trim(); - return old; - } - - /** - * 动态扩容 - * @param capaticy - */ - private void updateCapaticy(int capaticy){ - int oldCapaticy = elements.length; - if (oldCapaticy >= capaticy) return; - // 扩容为1.5倍 - int newCapaticy = oldCapaticy + (oldCapaticy >> 1); - E[] newElements = (E[]) new Object[newCapaticy]; - // 移动之前元素 - for (int i = 0; i < size; i++){ - newElements[i] = elements[i]; - } - elements = newElements; - System.out.println(oldCapaticy + "- 扩容为 -" + newCapaticy); - } - - /** - * 动态缩容 - */ - private void trim(){ - // 30 - int oldCapacity = elements.length; - // 15 - int newCapacity = oldCapacity >> 1; - if (size > (newCapacity) || oldCapacity <= DEFAULT_CAPACITY) return; - - // 剩余空间还很多 - E[] newElements = (E[]) new Object[newCapacity]; - for (int i = 0; i < size; i++) { - newElements[i] = elements[i]; - } - elements = newElements; - - System.out.println(oldCapacity + "缩容为" + newCapacity); - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(elements[i]); - }else{ - buffer.append("," + elements[i]); - } - } - buffer.append("]"); - return buffer.toString(); - } -} diff --git "a/\346\240\210/src/com/xhp281/common/LinkedList.java" "b/\346\240\210/src/com/xhp281/common/LinkedList.java" deleted file mode 100644 index 5a6d426..0000000 --- "a/\346\240\210/src/com/xhp281/common/LinkedList.java" +++ /dev/null @@ -1,143 +0,0 @@ -package com.xhp281.single; -import com.xhp281.common.AbstractList; -import com.xhp281.common.List; - -/** - * User: FenDou - * Date: 2019-05-08 10:32 - * Description: - */ - -public class LinkedList extends AbstractList { - private Node first; - // 内部类 - private static class Node{ - E element; - Node next; - // 构造方法 - public Node(E element, Node next) { - this.element = element; - this.next = next; - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - System.out.println("释放了"); - } - } - - /** - * 清除所有元素 - */ - public void clear(){ - size = 0; - first = null; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - if (index == 0){ - first = new Node(element,first); - }else{ - Node pre = node(index - 1); - pre.next = new Node<>(element,pre.next); // 设置 index 位置的数据 - } - size++; - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - - Node node = first; - if (element == null){ - for (int i = 0; i < size; i++) { - if (node.element == null) return i; - node = node.next; - } - }else{ - for(int i = 0; i < size; i++){ - if (element.equals(node.element)) return i; - node = node.next; - } - } - return List.ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - return node(index).element; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - Node node = node(index); - E old = node.element; - node.element = element; - return old; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - Node node = first; - if (index == 0){ - first = first.next; - }else{ - Node pre = node(index - 1); - node = pre.next; // 获取要删除的元素 - pre.next = node.next; // 修改之前的对象元素指向 index+1 对象 - } - size--; - return node.element; - } - - /** - * 根据下标查找对象 - * @param index - * @return - */ - private Node node(int index){ - // 检查下标是不是合理 - checkRange(index); - Node node = first; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - Node node = first; - - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(node.element); - }else{ - buffer.append("," + node.element); - } - node = node.next; - } - buffer.append("]"); - return buffer.toString(); - } -} \ No newline at end of file diff --git "a/\346\240\210/src/com/xhp281/common/List.java" "b/\346\240\210/src/com/xhp281/common/List.java" deleted file mode 100644 index f28f13e..0000000 --- "a/\346\240\210/src/com/xhp281/common/List.java" +++ /dev/null @@ -1,54 +0,0 @@ -package com.xhp281.common; - -/** - * User: FenDou - * Date: 2019-05-07 18:16 - * Description: 接口 - */ - -public interface List { - - /** - * 未找到 - */ - static final int ELEMENT_NOT_FOUND = -1; - - /** - * 清除所有元素 - */ - public void clear(); - - /** - * 获取元素数量 - */ - public int size(); - /** - * 是否为空 - */ - public boolean isempty(); - - /** - * 判断元素下标 - */ - public int indexOf(E element); - /** - * 根据下标获取元素 - */ - public E get(int index); - /** - * 设置index位置的元素 - */ - public E set(int index,E element); - /** - * 添加到指定位置 - */ - public void add(int index,E element); - /** - * 插入尾部 - */ - public void add(E element); - /** - * 删除元素 - */ - public E remove(int index); -} diff --git "a/\346\240\210/src/com/xhp281/stack/Stack.java" "b/\346\240\210/src/com/xhp281/stack/Stack.java" deleted file mode 100644 index 8f9f547..0000000 --- "a/\346\240\210/src/com/xhp281/stack/Stack.java" +++ /dev/null @@ -1,32 +0,0 @@ -package com.xhp281.stack; - -import com.xhp281.common.ArrayList; -import com.xhp281.common.List; - -/** - * User: FenDou - * Date: 2019-05-14 17:45 - * Description: 栈 - */ - -public class Stack { - - private List list = new ArrayList<>(); - - public boolean isempty(){ - return list.isempty(); - } - - public void push(E element){ - list.add(element); - } - - public E pop(){ - return list.remove(list.size() - 1); - } - - public E top(){ - return list.get(list.size() - 1); - } - -} diff --git "a/\347\272\242\351\273\221\346\240\221/.gitignore" "b/\347\272\242\351\273\221\346\240\221/.gitignore" deleted file mode 100644 index 10f5518..0000000 --- "a/\347\272\242\351\273\221\346\240\221/.gitignore" +++ /dev/null @@ -1,6 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -# IntelliJ project files -.idea -*.iml -out -gen diff --git "a/\347\272\242\351\273\221\346\240\221/.idea/misc.xml" "b/\347\272\242\351\273\221\346\240\221/.idea/misc.xml" deleted file mode 100644 index 0548357..0000000 --- "a/\347\272\242\351\273\221\346\240\221/.idea/misc.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/\347\272\242\351\273\221\346\240\221/.idea/modules.xml" "b/\347\272\242\351\273\221\346\240\221/.idea/modules.xml" deleted file mode 100644 index 7b690bf..0000000 --- "a/\347\272\242\351\273\221\346\240\221/.idea/modules.xml" +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git "a/\347\272\242\351\273\221\346\240\221/.idea/vcs.xml" "b/\347\272\242\351\273\221\346\240\221/.idea/vcs.xml" deleted file mode 100644 index 6c0b863..0000000 --- "a/\347\272\242\351\273\221\346\240\221/.idea/vcs.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/\347\272\242\351\273\221\346\240\221/.idea/workspace.xml" "b/\347\272\242\351\273\221\346\240\221/.idea/workspace.xml" deleted file mode 100644 index 4102b35..0000000 --- "a/\347\272\242\351\273\221\346\240\221/.idea/workspace.xml" +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - levelOrder - level - removeAfterFixNode - left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1559029371352 - - - 1559040973000 - - - 1559041030850 - - - 1559126548392 - - - 1559189161637 - - - 1559213871230 - - - 1559299479993 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/file/Files.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/file/Files.java" deleted file mode 100644 index 393faf5..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/file/Files.java" +++ /dev/null @@ -1,36 +0,0 @@ -package com.xhp281.file; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; - -/** - * User: FenDou - * Date: 2019-05-20 11:47 - * Description: - */ - -public class Files { - public static void writeToFile(String filePath, Object data) { - writeToFile(filePath, data, false); - } - - public static void writeToFile(String filePath, Object data, boolean append) { - if (filePath == null || data == null) return; - - try { - File file = new File(filePath); - if (!file.exists()) { - file.getParentFile().mkdirs(); - file.createNewFile(); - } - - try (FileWriter writer = new FileWriter(file, append); - BufferedWriter out = new BufferedWriter(writer) ) { - out.write(data.toString()); - out.flush(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" deleted file mode 100755 index 25ce322..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/BinaryTreeInfo.java" +++ /dev/null @@ -1,20 +0,0 @@ -package com.xhp281.printer; - -public interface BinaryTreeInfo { - /** - * who is the root node - */ - Object root(); - /** - * how to get the left child of the node - */ - Object left(Object node); - /** - * how to get the right child of the node - */ - Object right(Object node); - /** - * how to print the node - */ - Object string(Object node); -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/BinaryTrees.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/BinaryTrees.java" deleted file mode 100755 index 1f0d6f5..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/BinaryTrees.java" +++ /dev/null @@ -1,48 +0,0 @@ -package com.xhp281.printer; - -/** - * - * @author MJ Lee - * - */ -public final class BinaryTrees { - - private BinaryTrees() { - } - - public static void print(BinaryTreeInfo tree) { - print(tree, null); - } - - public static void println(BinaryTreeInfo tree) { - println(tree, null); - } - - public static void print(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return; - printer(tree, style).print(); - } - - public static void println(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return; - printer(tree, style).println(); - } - - public static String printString(BinaryTreeInfo tree) { - return printString(tree, null); - } - - public static String printString(BinaryTreeInfo tree, PrintStyle style) { - if (tree == null || tree.root() == null) return null; - return printer(tree, style).printString(); - } - - private static Printer printer(BinaryTreeInfo tree, PrintStyle style) { - if (style == PrintStyle.INORDER) return new InorderPrinter(tree); - return new LevelOrderPrinter(tree); - } - - public enum PrintStyle { - LEVEL_ORDER, INORDER - } -} \ No newline at end of file diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/InorderPrinter.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/InorderPrinter.java" deleted file mode 100755 index f26d136..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/InorderPrinter.java" +++ /dev/null @@ -1,89 +0,0 @@ -package com.xhp281.printer; - -/** - - ┌──800 - ┌──760 - │ └──600 - ┌──540 - │ └──476 - │ └──445 - ┌──410 - │ └──394 -381 - │ ┌──190 - │ │ └──146 - │ ┌──40 - │ │ └──35 - └──12 - └──9 - - * @author MJ Lee - * - */ -public class InorderPrinter extends Printer { - private static String rightAppend; - private static String leftAppend; - private static String blankAppend; - private static String lineAppend; - static { - int length = 2; - rightAppend = "┌" + Strings.repeat("─", length); - leftAppend = "└" + Strings.repeat("─", length); - blankAppend = Strings.blank(length + 1); - lineAppend = "│" + Strings.blank(length); - } - - public InorderPrinter(BinaryTreeInfo tree) { - super(tree); - } - - @Override - public String printString() { - StringBuilder string = new StringBuilder( - printString(tree.root(), "", "", "")); - string.deleteCharAt(string.length() - 1); - return string.toString(); - } - - /** - * 生成node节点的字符串 - * @param nodePrefix node那一行的前缀字符串 - * @param leftPrefix node整棵左子树的前缀字符串 - * @param rightPrefix node整棵右子树的前缀字符串 - * @return - */ - private String printString( - Object node, - String nodePrefix, - String leftPrefix, - String rightPrefix) { - Object left = tree.left(node); - Object right = tree.right(node); - String string = tree.string(node).toString(); - - int length = string.length(); - if (length % 2 == 0) { - length--; - } - length >>= 1; - - String nodeString = ""; - if (right != null) { - rightPrefix += Strings.blank(length); - nodeString += printString(right, - rightPrefix + rightAppend, - rightPrefix + lineAppend, - rightPrefix + blankAppend); - } - nodeString += nodePrefix + string + "\n"; - if (left != null) { - leftPrefix += Strings.blank(length); - nodeString += printString(left, - leftPrefix + leftAppend, - leftPrefix + blankAppend, - leftPrefix + lineAppend); - } - return nodeString; - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" deleted file mode 100755 index e994e9f..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/LevelOrderPrinter.java" +++ /dev/null @@ -1,528 +0,0 @@ -package com.xhp281.printer; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; - -/** - - ┌───381────┐ - │ │ -┌─12─┐ ┌─410─┐ -│ │ │ │ -9 ┌─40─┐ 394 ┌─540─┐ - │ │ │ │ - 35 ┌─190 ┌─476 ┌─760─┐ - │ │ │ │ - 146 445 600 800 - - * @author MJ Lee - * - */ -public class LevelOrderPrinter extends Printer { - /** - * 节点之间允许的最小间距(最小只能填1) - */ - private static final int MIN_SPACE = 1; - private Node root; - private int minX; - private int maxWidth; - - public LevelOrderPrinter(BinaryTreeInfo tree) { - super(tree); - - root = new Node(tree.root(), tree); - maxWidth = root.width; - } - - @Override - public String printString() { - // nodes用来存放所有的节点 - List> nodes = new ArrayList<>(); - fillNodes(nodes); - cleanNodes(nodes); - compressNodes(nodes); - addLineNodes(nodes); - - int rowCount = nodes.size(); - - // 构建字符串 - StringBuilder string = new StringBuilder(); - for (int i = 0; i < rowCount; i++) { - if (i != 0) { - string.append("\n"); - } - - List rowNodes = nodes.get(i); - StringBuilder rowSb = new StringBuilder(); - for (Node node : rowNodes) { - int leftSpace = node.x - rowSb.length() - minX; - rowSb.append(Strings.blank(leftSpace)); - rowSb.append(node.string); - } - - string.append(rowSb); - } - - return string.toString(); - } - - /** - * 添加一个元素节点 - */ - private Node addNode(List nodes, Object btNode) { - Node node = null; - if (btNode != null) { - node = new Node(btNode, tree); - maxWidth = Math.max(maxWidth, node.width); - nodes.add(node); - } else { - nodes.add(null); - } - return node; - } - - /** - * 以满二叉树的形式填充节点 - */ - private void fillNodes(List> nodes) { - if (nodes == null) return; - // 第一行 - List firstRowNodes = new ArrayList<>(); - firstRowNodes.add(root); - nodes.add(firstRowNodes); - - // 其他行 - while (true) { - List preRowNodes = nodes.get(nodes.size() - 1); - List rowNodes = new ArrayList<>(); - - boolean notNull = false; - for (Node node : preRowNodes) { - if (node == null) { - rowNodes.add(null); - rowNodes.add(null); - } else { - Node left = addNode(rowNodes, tree.left(node.btNode)); - if (left != null) { - node.left = left; - left.parent = node; - notNull = true; - } - - Node right = addNode(rowNodes, tree.right(node.btNode)); - if (right != null) { - node.right = right; - right.parent = node; - notNull = true; - } - } - } - - // 全是null,就退出 - if (!notNull) break; - nodes.add(rowNodes); - } - } - - /** - * 删除全部null、更新节点的坐标 - */ - private void cleanNodes(List> nodes) { - if (nodes == null) return; - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - // 最后一行的节点数量 - int lastRowNodeCount = nodes.get(rowCount - 1).size(); - - // 每个节点之间的间距 - int nodeSpace = maxWidth + 2; - - // 最后一行的长度 - int lastRowLength = lastRowNodeCount * maxWidth - + nodeSpace * (lastRowNodeCount - 1); - - // 空集合 - Collection nullSet = Collections.singleton(null); - - for (int i = 0; i < rowCount; i++) { - List rowNodes = nodes.get(i); - - int rowNodeCount = rowNodes.size(); - // 节点左右两边的间距 - int allSpace = lastRowLength - (rowNodeCount - 1) * nodeSpace; - int cornerSpace = allSpace / rowNodeCount - maxWidth; - cornerSpace >>= 1; - - int rowLength = 0; - for (int j = 0; j < rowNodeCount; j++) { - if (j != 0) { - // 每个节点之间的间距 - rowLength += nodeSpace; - } - rowLength += cornerSpace; - Node node = rowNodes.get(j); - if (node != null) { - // 居中(由于奇偶数的问题,可能有1个符号的误差) - int deltaX = (maxWidth - node.width) >> 1; - node.x = rowLength + deltaX; - node.y = i; - } - rowLength += maxWidth; - rowLength += cornerSpace; - } - // 删除所有的null - rowNodes.removeAll(nullSet); - } - } - - /** - * 压缩空格 - */ - private void compressNodes(List> nodes) { - if (nodes == null) return; - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - for (int i = rowCount - 2; i >= 0; i--) { - List rowNodes = nodes.get(i); - for (Node node : rowNodes) { - Node left = node.left; - Node right = node.right; - if (left == null && right == null) continue; - if (left != null && right != null) { - // 让左右节点对称 - node.balance(left, right); - - // left和right之间可以挪动的最小间距 - int leftEmpty = node.leftBoundEmptyLength(); - int rightEmpty = node.rightBoundEmptyLength(); - int empty = Math.min(leftEmpty, rightEmpty); - empty = Math.min(empty, (right.x - left.rightX()) >> 1); - - // left、right的子节点之间可以挪动的最小间距 - int space = left.minLevelSpaceToRight(right) - MIN_SPACE; - space = Math.min(space >> 1, empty); - - // left、right往中间挪动 - if (space > 0) { - left.translateX(space); - right.translateX(-space); - } - - // 继续挪动 - space = left.minLevelSpaceToRight(right) - MIN_SPACE; - if (space < 1) continue; - - // 可以继续挪动的间距 - leftEmpty = node.leftBoundEmptyLength(); - rightEmpty = node.rightBoundEmptyLength(); - if (leftEmpty < 1 && rightEmpty < 1) continue; - - if (leftEmpty > rightEmpty) { - left.translateX(Math.min(leftEmpty, space)); - } else { - right.translateX(-Math.min(rightEmpty, space)); - } - } else if (left != null) { - left.translateX(node.leftBoundEmptyLength()); - } else { // right != null - right.translateX(-node.rightBoundEmptyLength()); - } - } - } - } - - private void addXLineNode(List curRow, Node parent, int x) { - Node line = new Node("─"); - line.x = x; - line.y = parent.y; - curRow.add(line); - } - - private Node addLineNode(List curRow, List nextRow, Node parent, Node child) { - if (child == null) return null; - - Node top = null; - int topX = child.topLineX(); - if (child == parent.left) { - top = new Node("┌"); - curRow.add(top); - - for (int x = topX + 1; x < parent.x; x++) { - addXLineNode(curRow, parent, x); - } - } else { - for (int x = parent.rightX(); x < topX; x++) { - addXLineNode(curRow, parent, x); - } - - top = new Node("┐"); - curRow.add(top); - } - - // 坐标 - top.x = topX; - top.y = parent.y; - child.y = parent.y + 2; - minX = Math.min(minX, child.x); - - // 竖线 - Node bottom = new Node("│"); - bottom.x = topX; - bottom.y = parent.y + 1; - nextRow.add(bottom); - - return top; - } - - private void addLineNodes(List> nodes) { - List> newNodes = new ArrayList<>(); - - int rowCount = nodes.size(); - if (rowCount < 2) return; - - minX = root.x; - - for (int i = 0; i < rowCount; i++) { - List rowNodes = nodes.get(i); - if (i == rowCount - 1) { - newNodes.add(rowNodes); - continue; - } - - List newRowNodes = new ArrayList<>(); - newNodes.add(newRowNodes); - - List lineNodes = new ArrayList<>(); - newNodes.add(lineNodes); - for (Node node : rowNodes) { - addLineNode(newRowNodes, lineNodes, node, node.left); - newRowNodes.add(node); - addLineNode(newRowNodes, lineNodes, node, node.right); - } - } - - nodes.clear(); - nodes.addAll(newNodes); - } - - private static class Node { - /** - * 顶部符号距离父节点的最小距离(最小能填0) - */ - private static final int TOP_LINE_SPACE = 1; - - Object btNode; - Node left; - Node right; - Node parent; - /** - * 首字符的位置 - */ - int x; - int y; - int treeHeight; - String string; - int width; - - private void init(String string) { - string = (string == null) ? "null" : string; - string = string.isEmpty() ? " " : string; - - width = string.length(); - this.string = string; - } - - public Node(String string) { - init(string); - } - - public Node(Object btNode, BinaryTreeInfo opetaion) { - init(opetaion.string(btNode).toString()); - - this.btNode = btNode; - } - - /** - * 顶部方向字符的X(极其重要) - * - * @return - */ - private int topLineX() { - // 宽度的一半 - int delta = width; - if (delta % 2 == 0) { - delta--; - } - delta >>= 1; - - if (parent != null && this == parent.left) { - return rightX() - 1 - delta; - } else { - return x + delta; - } - } - - /** - * 右边界的位置(rightX 或者 右子节点topLineX的下一个位置)(极其重要) - */ - private int rightBound() { - if (right == null) return rightX(); - return right.topLineX() + 1; - } - - /** - * 左边界的位置(x 或者 左子节点topLineX)(极其重要) - */ - private int leftBound() { - if (left == null) return x; - return left.topLineX(); - } - - /** - * x ~ 左边界之间的长度(包括左边界字符) - * - * @return - */ - private int leftBoundLength() { - return x - leftBound(); - } - - /** - * rightX ~ 右边界之间的长度(包括右边界字符) - * - * @return - */ - private int rightBoundLength() { - return rightBound() - rightX(); - } - - /** - * 左边界可以清空的长度 - * - * @return - */ - private int leftBoundEmptyLength() { - return leftBoundLength() - 1 - TOP_LINE_SPACE; - } - - /** - * 右边界可以清空的长度 - * - * @return - */ - private int rightBoundEmptyLength() { - return rightBoundLength() - 1 - TOP_LINE_SPACE; - } - - /** - * 让left和right基于this对称 - */ - private void balance(Node left, Node right) { - if (left == null || right == null) - return; - // 【left的尾字符】与【this的首字符】之间的间距 - int deltaLeft = x - left.rightX(); - // 【this的尾字符】与【this的首字符】之间的间距 - int deltaRight = right.x - rightX(); - - int delta = Math.max(deltaLeft, deltaRight); - int newRightX = rightX() + delta; - right.translateX(newRightX - right.x); - - int newLeftX = x - delta - left.width; - left.translateX(newLeftX - left.x); - } - - private int treeHeight(Node node) { - if (node == null) return 0; - if (node.treeHeight != 0) return node.treeHeight; - node.treeHeight = 1 + Math.max( - treeHeight(node.left), treeHeight(node.right)); - return node.treeHeight; - } - - /** - * 和右节点之间的最小层级距离 - */ - private int minLevelSpaceToRight(Node right) { - int thisHeight = treeHeight(this); - int rightHeight = treeHeight(right); - int minSpace = Integer.MAX_VALUE; - for (int i = 0; i < thisHeight && i < rightHeight; i++) { - int space = right.levelInfo(i).leftX - - this.levelInfo(i).rightX; - minSpace = Math.min(minSpace, space); - } - return minSpace; - } - - private LevelInfo levelInfo(int level) { - if (level < 0) return null; - int levelY = y + level; - if (level >= treeHeight(this)) return null; - - List list = new ArrayList<>(); - Queue queue = new LinkedList<>(); - queue.offer(this); - - // 层序遍历找出第level行的所有节点 - while (!queue.isEmpty()) { - Node node = queue.poll(); - if (levelY == node.y) { - list.add(node); - } else if (node.y > levelY) break; - - if (node.left != null) { - queue.offer(node.left); - } - if (node.right != null) { - queue.offer(node.right); - } - } - - Node left = list.get(0); - Node right = list.get(list.size() - 1); - return new LevelInfo(left, right); - } - - /** - * 尾字符的下一个位置 - */ - public int rightX() { - return x + width; - } - - public void translateX(int deltaX) { - if (deltaX == 0) return; - x += deltaX; - - // 如果是LineNode - if (btNode == null) return; - - if (left != null) { - left.translateX(deltaX); - } - if (right != null) { - right.translateX(deltaX); - } - } - } - - private static class LevelInfo { - int leftX; - int rightX; - - public LevelInfo(Node left, Node right) { - this.leftX = left.leftBound(); - this.rightX = right.rightBound(); - } - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/Printer.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/Printer.java" deleted file mode 100755 index 9f91e23..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/Printer.java" +++ /dev/null @@ -1,32 +0,0 @@ -package com.xhp281.printer; - -public abstract class Printer { - /** - * 二叉树的基本信息 - */ - protected BinaryTreeInfo tree; - - public Printer(BinaryTreeInfo tree) { - this.tree = tree; - } - - /** - * 生成打印的字符串 - */ - public abstract String printString(); - - /** - * 打印后换行 - */ - public void println() { - print(); - System.out.println(); - } - - /** - * 打印 - */ - public void print() { - System.out.print(printString()); - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/Strings.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/Strings.java" deleted file mode 100755 index 402e957..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/printer/Strings.java" +++ /dev/null @@ -1,19 +0,0 @@ -package com.xhp281.printer; - -public class Strings { - public static String repeat(String string, int count) { - if (string == null) return null; - - StringBuilder builder = new StringBuilder(); - while (count-- > 0) { - builder.append(string); - } - return builder.toString(); - } - - public static String blank(int length) { - if (length < 0) return null; - if (length == 0) return ""; - return String.format("%" + length + "s", ""); - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/test/Main.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/test/Main.java" deleted file mode 100644 index f5a04dc..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/test/Main.java" +++ /dev/null @@ -1,117 +0,0 @@ -package com.xhp281.test; -import com.xhp281.tree.AVLTree; -import com.xhp281.tree.BST; -import com.xhp281.printer.BinaryTrees; -import com.xhp281.tree.BinaryTree; -import com.xhp281.tree.BinaryTree.Visitor; -import com.xhp281.tree.RBTree; - -/** - * User: FenDou - * Date: 2019-05-20 10:58 - * Description: - */ - -public class Main {// 创建比较器 - - /** - * 测试 - */ - static void test1(){ - Integer data[] = new Integer[] { - 9, 80, 33, 5, 67, 17, 11 - }; -// RBTree rbTree = new RBTree<>(); -// for (int i = 0; i < data.length; i++) { -// rbTree.add(data[i]); -// } -// BinaryTrees.println(rbTree); - AVLTree rbTree = new AVLTree<>(); - for (int i = 0; i < data.length; i++) { - rbTree.add(data[i]); - } - BinaryTrees.println(rbTree); - System.out.println(rbTree.isComplete()); - } - - static void test2(){ - Integer data[] = new Integer[] { - 9, 80, 33, 5, 67, 17, 11 - }; - BST bst = new BST<>(); - for (int i = 0; i < data.length; i++) { - bst.add(data[i]); - } - BinaryTrees.println(bst); - - // 前序遍历 - System.out.println("** 前序遍历 **"); - bst.preorderOrder(new Visitor() { - @Override - public boolean visit(Integer element) { - System.out.print(" " + element); - return element == 80 ? true : false; - } - }); - - System.out.println(); - System.out.println("** 中序遍历 **"); - bst.inorderOrder(new Visitor() { - @Override - public boolean visit(Integer element) { - System.out.print(" " + element); - return element == 17 ? true : false; - } - }); - - System.out.println(); - System.out.println("** 后序遍历 **"); - bst.postorderOrder(new Visitor() { - @Override - public boolean visit(Integer element) { - System.out.print(" " + element); - return element == 67 ? true : false; - } - }); - - System.out.println(); - System.out.println("** 层序遍历 **"); - bst.levelOrder(new Visitor() { - @Override - public boolean visit(Integer element) { - System.out.print(" " + element); - return element == 67 ? true : false; - } - }); - } - - /** - * 测试 - */ - static void test3(){ - Integer data[] = new Integer[] { - 9, 80, 33, 5, 67, 17, 11 - }; - RBTree rbTree = new RBTree<>(); - for (int i = 0; i < data.length; i++) { - rbTree.add(data[i]); - } - - BinaryTrees.println(rbTree); - System.out.println("删除之后"); - rbTree.remove(17); - rbTree.remove(80); - rbTree.remove(11); - rbTree.remove(9); - rbTree.remove(5); - - BinaryTrees.println(rbTree); - } - /** - * 主函数 - * @param args - */ - public static void main(String[] args) { - test3(); - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/AVLTree.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/AVLTree.java" deleted file mode 100644 index c710b53..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/AVLTree.java" +++ /dev/null @@ -1,202 +0,0 @@ -package com.xhp281.tree; -import java.util.Comparator; - -/** - * User: FenDou - * Date: 2019-05-29 14:17 - * Description: AVL树 - */ -public class AVLTree extends BBST{ - /** - * 初始化方法 - */ - public AVLTree(){ - this(null); - } - public AVLTree(Comparator comparator){ - super(comparator); - } - - /** - * 创建节点 - * @param element - * @param parent - * @return - */ - @Override - protected Node createNode(E element, Node parent) { - return new AVLNode<>(element,parent); - } - - /** - * AVL节点 - * @param - */ - private static class AVLNode extends Node { - // 叶子节点默认高度 1 - int height = 1; - public AVLNode(E element, Node parent) { - super(element, parent); - } - - /* 更新自己的高度 */ - public void updateHeight(){ - int leftHeight = leftNode == null ? 0 : ((AVLNode)leftNode).height; - int rightHeight = rightNode == null ? 0 : ((AVLNode)rightNode).height; - height = 1 + Math.max(leftHeight,rightHeight); - } - - /* 获取平衡因子 */ - public int balanceFactor(){ - int leftHeight = leftNode == null ? 0 : ((AVLNode)leftNode).height; - int rightHeight = rightNode == null ? 0 : ((AVLNode)rightNode).height; - return leftHeight - rightHeight; - } - - /* 获取度最高的节点 */ - public Node tallerChild() { - int leftHeight = leftNode == null ? 0 : ((AVLNode) leftNode).height; - int rightHeight = rightNode == null ? 0 : ((AVLNode) rightNode).height; - if (leftHeight > rightHeight) return leftNode; - if (leftHeight < rightHeight) return rightNode; - return isLeftChild() ? leftNode : rightNode; - } - - /* 打印内容 */ - @Override - public String toString() { - String parentString = "null"; - if (parent != null) { - parentString = parent.element.toString(); - } - return element + "";// + "_p(" + parentString + ")_h(" + height + ")"; - } - } - - /** - * 调整二叉树 - * @param node - */ - @Override - protected void addAfterFixNode(Node node) { - // 循环 - while ((node = node.parent) != null){ - - // 是平衡节点,更新高度 - if (isBalance(node)){ - updateHeight(node); - - // 调整平衡 - }else{ - // 恢复平衡 - rebalance(node); - // 整棵树都恢复平衡,结束循环 - break; - } - } - } - /** - * 删除之后调整失衡节点 - * @param node - */ - protected void removeAfterFixNode(Nodenode){ - while ((node = node.parent) != null){ - if (isBalance(node)){ - updateHeight(node); - }else{ - rebalance(node); - } - } - } - - /** - * 判断是不是平衡 - * @param node - * @return - */ - public boolean isBalance(Node node){ - return Math.abs(((AVLNode)node).balanceFactor()) <= 1; - } - - /** - * 更新高度 - * @param node - */ - public void updateHeight(Node node){ - ((AVLNode)node).updateHeight(); - } - - /** - * 恢复平衡方式1 - @param grand 高度最低的不平衡节点 - */ - public void rebalance(Node grand){ - Node parent = ((AVLNode)grand).tallerChild(); - Node node = ((AVLNode)parent).tallerChild(); - - // 属于左边 - if (parent.isLeftChild()){ - if (node.isLeftChild()){ // LL - rotate(grand,node.leftNode,node,node.rightNode,parent,parent.rightNode,grand,grand.rightNode); - }else{ // LR - rotate(grand,parent.leftNode,parent,node.leftNode,node,node.rightNode,grand,grand.rightNode); - } - }else{ - if (node.isLeftChild()){ // RL - rotate(grand,grand.leftNode,grand,node.leftNode,node,node.rightNode,parent,parent.rightNode); - }else{ // RR - rotate(grand,grand.leftNode,grand,parent.leftNode,parent,node.leftNode,node,node.rightNode); - } - } - } - /** - * 恢复平衡方式2 - @param grand 高度最低的不平衡节点 - */ - public void rebalance2(Node grand){ - Node parent = ((AVLNode)grand).tallerChild(); - Node node = ((AVLNode)parent).tallerChild(); - - // 属于左边 - if (parent.isLeftChild()){ - if (node.isLeftChild()){ // LL - rotateRight(grand); - }else{ // LR - rotateLeft(parent); - rotateRight(grand); - } - }else{ - if (node.isLeftChild()){ // RL - rotateRight(parent); - rotateLeft(grand); - }else{ // RR - rotateLeft(grand); - } - } - } - - /** - * AVL树旋转之后调整高度 - */ - @Override - protected void afterRotate(Node grand, Node parent, Node child) { - super.afterRotate(grand, parent, child); - - // 更新高度 - updateHeight(grand); - updateHeight(parent); - } - - /** - * AVL树调整高度 - */ - @Override - protected void rotate(Node p, Node a, Node b, Node c, Node d, Node e, Node f, Node g) { - super.rotate(p, a, b, c, d, e, f, g); - - // 更新高度 - updateHeight(b); - updateHeight(f); - updateHeight(d); - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BBST.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BBST.java" deleted file mode 100644 index 230a3b2..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BBST.java" +++ /dev/null @@ -1,132 +0,0 @@ -package com.xhp281.tree; - -import java.util.Comparator; - -/** - * User: FenDou - * Date: 2019-05-29 14:17 - * Description: 平衡二叉搜索树 - */ - -public class BBST extends BST { - - /** - * 初始化方法 - */ - public BBST(){ - this(null); - } - public BBST(Comparator comparator){ - super(comparator); - } - - /** - * 左旋转 - * @param grand - */ - protected void rotateLeft(Node grand){ - // RR的情况 - // 获取parent - Node parent = grand.rightNode; - Node parentOldLeft = parent.leftNode; - - // 交换子节点 - grand.rightNode = parentOldLeft; - parent.leftNode = grand; - - // 旋转之后处理 - afterRotate(grand,parent,parentOldLeft); - } - - /** - * 右旋转 - * @param grand - */ - protected void rotateRight(Node grand){ - // LL情况 - Node parent = grand.leftNode; - Node parentOldRight = parent.rightNode; - - // 交换子节点 - grand.leftNode = parentOldRight; - parent.rightNode = grand; - - // 旋转之后处理 - afterRotate(grand,parent,parentOldRight); - } - - /** - * 旋转 - */ - protected void rotate( - Node p, - Node a,Node b,Node c, - Node d, - Node e,Node f,Node g){ - - // 设置d成为根节点 - d.parent = p.parent; - if (p.isLeftChild()){ - p.parent.leftNode = d; - }else if(p.isRightChild()){ - p.parent.rightNode = d; - }else{ - root = d; - } - - // 设置a-b-c - b.leftNode = a; - if (a != null){ - a.parent = b; - } - b.rightNode = c; - if (c != null){ - c.parent = b; - } - - // 设置e-f-g - f.leftNode = e; - if (e != null){ - e.parent = f; - } - f.rightNode = g; - if (g != null){ - g.parent = f; - } - - // 设置b-d-f - d.leftNode = b; - d.rightNode = f; - b.parent = d; - f.parent = d; - - } - - /** - * 旋转之后的处理 - * @param grand - * @param parent - * @param child - */ - protected void afterRotate(Node grand,Node parent,Node child){ - // 更新parent根节点 - parent.parent = grand.parent; - - // 设置parent在根节点的左右位置 - if (grand.isLeftChild()){ - grand.parent.leftNode = parent; - }else if (grand.isRightChild()){ - grand.parent.rightNode = parent; - }else { - root = parent; - } - - // 更新parentOldRight的parent - if (child != null) { - child.parent = grand; - } - - // 更新grand的parent - grand.parent = parent; - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BST.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BST.java" deleted file mode 100644 index af51526..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BST.java" +++ /dev/null @@ -1,221 +0,0 @@ -package com.xhp281.tree; -import java.util.Comparator; - -/** - * User: FenDou - * Date: 2019-05-17 13:53 - * Description: 二叉搜索树 - */ - -public class BST extends BinaryTree { - - private Comparator comparator; - - /** - * 初始化方式 - */ - public BST(){ - this(null); - } - public BST(Comparator comparator) { - this.comparator = comparator; - } - - /** - * 添加 - * @param element - */ - public void add(E element){ - checkElementIsNull(element); - - // 添加第一个节点 - if (root == null){ - root = createNode(element,null);//new Node<>(element,null); - size++; - - // 添加完新节点后处理 - addAfterFixNode(root); - return; - } - - // 父节点 - Node parent = root; - // 添加其他节点,首先找到父节点 - Node node = root; - // 比较结果 - int cmp = 0; - while (node != null){ - // 比较大小 - cmp = compare(element,node.element); - // 获取父节点 - parent = node; - // 新元素 > 父节点:去右边查找 - if (cmp > 0){ - node = node.rightNode; - // 新元素< 父节点:去左边查找 - }else if (cmp < 0){ - node = node.leftNode; - }else{ - // 相等直接返回 - node.element = element; - return; - } - } - // 判断是设置为左子树还是右子树 - // 获取新节点 - Node newNode = createNode(element,parent);//new Node<>(element,parent); - if (cmp > 0){ // 右 - parent.rightNode = newNode; - }else{ - parent.leftNode = newNode; - } - size++; - - // 添加完新节点后处理 - addAfterFixNode(newNode); - } - - /** - * 是否包含 - * @param element - * @return - */ - public boolean contains(E element){ - return node(element) != null; - } - - /** - * 检测是不是为空 - * @param element - */ - private void checkElementIsNull(E element){ - if (element == null) { - throw new IllegalArgumentException("element must be not null"); - } - } - - /** - * 比较大小 - * @param e1 - * @param e2 - * @return 返回值等于0:e1 = e2 返回值大于0:e1 > e2 返回值小于0: e1 < e2 - */ - private int compare(E e1,E e2){ - // 有判断条件的时候使用判断条件 - if (comparator != null){ - return comparator.compare(e1, e2); - } - return ((Comparable)e1).compareTo(e2); - } - - /** - * 添加之后修复失衡节点 - * @param node - */ - protected void addAfterFixNode(Nodenode){} - - /** - * 删除之后调整失衡节点 - * @param node - */ - protected void removeAfterFixNode(Nodenode){} - -// ================================= 删除操作 - - public void remove(E element){ - remove(node(element)); - } - - /** - * 删除节点 - * @param node - */ - private void remove(Node node){ - if (node == null) return; - size--; - // 度数为2的节点 - if (node.hasTwoChildren()){ - // 找到后继节点 - Node sNode = successor(node); - // 用后继节点的值覆盖度为2的节点的值 - node.element = sNode.element; - // 删除后继节点 - node = sNode; - } - - // 删除node节点,度为1或者0 - Node replaceElement = node.leftNode != null ? node.leftNode : node.rightNode; - // node 是度数为1的节点 - if (replaceElement != null){ - // 更改父节点 - replaceElement.parent = node.parent; - // 更改 parent 的left,right指向 - if (node.parent == null){ - root = replaceElement; - }else if (node == node.parent.leftNode){ - node.parent.leftNode = replaceElement; - }else{ - node.parent.rightNode = replaceElement; - } - - // 删除之后调整节点 - removeAfterFixNode(replaceElement); - }else if(node.parent == null){ - // node 是叶子节点并且是根节点 - root = null; - - // 删除之后调整节点 - removeAfterFixNode(node); - }else{ - // node 叶子节点但不是根节点 - if (node == node.parent.leftNode){ - node.parent.leftNode = null; - }else{ - node.parent.rightNode = null; - } - - // 删除之后调整节点 - removeAfterFixNode(node); - } - - } - - /** - * 根据内容获取节点 - * @param element - * @return - */ - private Node node(E element){ - Node node = root; - while (node != null){ - int cmp = compare(element,node.element); - // 相等的时候返回 - if (cmp == 0) return node; - // 输入值大于当前节点,从右面找 - if (cmp > 0 ){ - node = node.rightNode; - }else{ - // 输入值小于当前节点,从左面开始找 - node = node.leftNode; - } - } - return null; - } - -// // ================================== 打印方法 -// -// @Override -// public String toString() { -// StringBuilder sb = new StringBuilder(); -// toString(root,sb,""); -// return sb.toString(); -// } -// private void toString(Node node,StringBuilder sb,String prefix){ -// if (node == null) return; -// sb.append(prefix).append(node.element).append("\n"); -// toString(node.leftNode,sb,prefix + "L --> "); -// toString(node.rightNode,sb,prefix + "R --> "); -// } - - -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BinaryTree.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BinaryTree.java" deleted file mode 100644 index 786467a..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/BinaryTree.java" +++ /dev/null @@ -1,345 +0,0 @@ -package com.xhp281.tree; - -import com.xhp281.printer.BinaryTreeInfo; -import java.util.LinkedList; -import java.util.Queue; - -/** - * User: FenDou - * Date: 2019-05-21 19:03 - * Description: 二叉树基类 - */ - -public class BinaryTree implements BinaryTreeInfo { - - /* 大小 */ - protected int size; - /* 根节点 */ - protected Node root; - - public int size(){ - return size; - } - - public boolean isempry(){ - return size == 0; - } - - public void clear(){ - root = null; - size = 0; - } - - - /** - * 节点对象 - * @param - */ - protected static class Node{ - public E element; - public Node rightNode; - public Node leftNode; - public Node parent; - - public Node(E element, Node parent) { - this.element = element; - this.parent = parent; - } - - /* 是不是叶子节点 */ - public boolean isLeaf(){ - return leftNode == null && rightNode == null; - } - - /* 拥有两个节点 */ - public boolean hasTwoChildren(){ - return leftNode != null && rightNode != null; - } - - /* 是不是左子树 */ - public boolean isLeftChild(){ - return parent != null && this == parent.leftNode; - } - - /* 是不是右子树 */ - public boolean isRightChild(){ - return parent != null && this == parent.rightNode; - } - - /* 获取兄弟节点 */ - public Node sibling(){ - if (isLeftChild()){ - return parent.rightNode; - } - if (isRightChild()){ - return parent.leftNode; - } - return null; - } - } - - /** - * 判断是不是完全二叉树 - * @return - */ - public Boolean isComplete(){ - if (root == null) return false; - Queue> queue = new LinkedList<>(); - queue.offer(root); - - // 是不是叶子节点 - boolean leaf = false; - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 如果不是叶子节点返回false - if (leaf && !node.isLeaf()) return false; - - if (node.leftNode != null){ - queue.offer(node.leftNode); - }else if (node.rightNode != null){ - return false; - } - - if (node.rightNode != null){ - queue.offer(node.rightNode); - }else{ - leaf = true; - } - } - return true; - } - - /** - * 创建节点 - * @param element - * @param parent - * @return - */ - protected Node createNode(E element,Node parent){ - return new Node<>(element,parent); - } - -//======================================= 获取节点 - /** - * 获取前驱节点 - * @param node - * @return - */ - public Node predecessor(Nodenode){ - if (node == null) return null; - // 前驱节点在左子树中 - - Node p = node.leftNode; - // 左子树不为空 node.left != null - if (p != null){ - // 循环遍历右子树 - while (p.rightNode != null){ - p = p.rightNode; - } - return p; - } - - // node.left = null && parent != null - while (node.parent != null && node == node.parent.leftNode){ - node = node.parent; - } - - // node.parent == null && node == node.parent.right - return node.parent; - } - /** - * 获取后驱节点 - * @param node - * @return - */ - public Node successor(Nodenode){ - if (node == null) return null; - // 前驱节点在右子树中 - - Node p = node.rightNode; - // 右子树不为空 node.right != null - if (p != null){ - // 循环遍历左子树 - while (p.leftNode != null){ - p = p.leftNode; - } - return p; - } - - // node.right = null && parent != null - while (node.parent != null && node == node.parent.rightNode){ - node = node.parent; - } - - // node.parent == null && node == node.parent.left - return node.parent; - } - -//======================================= 使用访问器接口进行遍历 - /** - * 访问器接口 - * @param - */ - public static abstract class Visitor{ - /* 是不是停止 */ - boolean stop; - /* 如果返回false停止遍历 */ - public abstract boolean visit(E element); - } - - /** - * 前序遍历 - */ - public void preorderOrder(Visitor visitor){ - if (visitor == null) return; - preorderOrder(root,visitor); - } - private void preorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - visitor.stop = visitor.visit(node.element); - preorderOrder(node.leftNode,visitor); - preorderOrder(node.rightNode,visitor); - } - - /** - * 中序遍历 - * 二叉搜索树的遍历结果是可以控制升序还是降序 - * 升序:中序遍历左子树、根节点、中序遍历右子树 - * 降序:中序遍历右子树、根节点、中序遍历左子树 - */ - public void inorderOrder(Visitor visitor){ - if (visitor == null) return; - inorderOrder(root,visitor); - } - private void inorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - inorderOrder(node.leftNode,visitor); - if (visitor.stop) return; - visitor.stop = visitor.visit(node.element); - inorderOrder(node.rightNode,visitor); - } - - /** - * 后序遍历遍历 - */ - public void postorderOrder(Visitor visitor){ - if (visitor == null) return; - postorderOrder(root,visitor); - } - - private void postorderOrder(Node node,Visitor visitor){ - if (node == null || visitor.stop) return; - - postorderOrder(node.leftNode,visitor); - postorderOrder(node.rightNode,visitor); - if (visitor.stop) return; - visitor.stop = visitor.visit(node.element); - } - - /** - * 层序遍历 - * @param visitor - */ - public void levelOrder(Visitor visitor){ - if (root == null|| visitor == null) return; - - Queue> queue = new LinkedList<>(); - queue.offer(root); - - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 判断是不是要返回 - if (visitor.visit(node.element)) return; - if (node.leftNode != null){ - queue.offer(node.leftNode); - } - if (node.rightNode != null){ - queue.offer(node.rightNode); - } - } - } -// ===================================== 计算二叉树高度 - /** - * 方式1 - * 获取树的高度,非递归方式 - * @return - */ - public int height(){ - if (root == null) return 0; - - // 树的高度 - int height = 0; - // 每层的数量 - int levelSize = 1; - - Queue> queue = new LinkedList<>(); - queue.offer(root); - - while (!queue.isEmpty()){ - Node node = queue.poll(); - // 访问的时候数量减少 - levelSize--; - - if (node.leftNode != null){ - queue.offer(node.leftNode); - } - if (node.rightNode != null){ - queue.offer(node.rightNode); - } - - // 遍历完一层,将要遍历下一层的时候获取下一层的数量 - if (levelSize == 0){ - levelSize = queue.size(); - height++; - } - } - return height; - } - /** - * 方式2 - * @return - */ - public int height2(){ - return height(root); - } - - /** - * 递归方式获取高度 - * @param node - * @return - */ - public int height(Node node){ - if (node == null) return 0; - return 1 + Math.max(height(node.leftNode),height(node.rightNode)); - } - -// ================================= 二叉树打印接口设置 - @Override - public Object root() { - return root; - } - - @Override - public Object left(Object node) { - return ((Node)node).leftNode; - } - - @Override - public Object right(Object node) { - return ((Node)node).rightNode; - } - - @Override - public Object string(Object node) { - // 获取父节点内容 -// Node currNode = (Node)node; -// String parentString = "null"; -// if (currNode.parent != null){ -// parentString = currNode.parent.element.toString(); -// } -// return currNode.element + "(" + parentString + ")"; - return node; - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/RBTree.java" "b/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/RBTree.java" deleted file mode 100644 index 6c24f80..0000000 --- "a/\347\272\242\351\273\221\346\240\221/src/com/xhp281/tree/RBTree.java" +++ /dev/null @@ -1,268 +0,0 @@ -package com.xhp281.tree; - -import java.util.Comparator; - -public class RBTree extends BBST { - private static final boolean RED = false; - private static final boolean BLACK = true; - - public RBTree() { - this(null); - } - - public RBTree(Comparator comparator) { - super(comparator); - } - - @Override - protected void addAfterFixNode(Node node) { - Node parent = node.parent; - - // 添加的是根节点 或者 上溢到达了根节点 - if (parent == null) { - black(node); - return; - } - - // 如果父节点是黑色,直接返回 - if (isBlack(parent)) return; - - // 叔父节点 - Node uncle = parent.sibling(); - // 祖父节点 - Node grand = red(parent.parent); - if (isRed(uncle)) { // 叔父节点是红色【B树节点上溢】 - black(parent); - black(uncle); - // 把祖父节点当做是新添加的节点 - addAfterFixNode(grand); - return; - } - - // 叔父节点不是红色 - if (parent.isLeftChild()) { // L - if (node.isLeftChild()) { // LL - black(parent); - } else { // LR - black(node); - rotateLeft(parent); - } - rotateRight(grand); - } else { // R - if (node.isLeftChild()) { // RL - black(node); - rotateRight(parent); - } else { // RR - black(parent); - } - rotateLeft(grand); - } - } - - @Override - protected void removeAfterFixNode(Node node) { - // 如果删除的节点是红色 - // 或者 用以取代删除节点的子节点是红色 - if (isRed(node)) { - black(node); - return; - } - - Node parent = node.parent; - // 删除的是根节点 - if (parent == null) return; - - // 删除的是黑色叶子节点【下溢】 - // 判断被删除的node是左还是右 - boolean left = parent.leftNode == null || node.isLeftChild(); - Node sibling = left ? parent.rightNode : parent.leftNode; - if (left) { // 被删除的节点在左边,兄弟节点在右边 - if (isRed(sibling)) { // 兄弟节点是红色 - black(sibling); - red(parent); - rotateLeft(parent); - // 更换兄弟 - sibling = parent.rightNode; - } - - // 兄弟节点必然是黑色 - if (isBlack(sibling.leftNode) && isBlack(sibling.rightNode)) { - // 兄弟节点没有1个红色子节点,父节点要向下跟兄弟节点合并 - boolean parentBlack = isBlack(parent); - black(parent); - red(sibling); - if (parentBlack) { - removeAfterFixNode(parent); - } - } else { // 兄弟节点至少有1个红色子节点,向兄弟节点借元素 - // 兄弟节点的左边是黑色,兄弟要先旋转 - if (isBlack(sibling.rightNode)) { - rotateRight(sibling); - sibling = parent.rightNode; - } - - color(sibling, colorOf(parent)); - black(sibling.rightNode); - black(parent); - rotateLeft(parent); - } - } else { // 被删除的节点在右边,兄弟节点在左边 - if (isRed(sibling)) { // 兄弟节点是红色 - black(sibling); - red(parent); - rotateRight(parent); - // 更换兄弟 - sibling = parent.leftNode; - } - - // 兄弟节点必然是黑色 - if (isBlack(sibling.leftNode) && isBlack(sibling.rightNode)) { - // 兄弟节点没有1个红色子节点,父节点要向下跟兄弟节点合并 - boolean parentBlack = isBlack(parent); - black(parent); - red(sibling); - if (parentBlack) { - removeAfterFixNode(parent); - } - } else { // 兄弟节点至少有1个红色子节点,向兄弟节点借元素 - // 兄弟节点的左边是黑色,兄弟要先旋转 - if (isBlack(sibling.leftNode)) { - rotateLeft(sibling); - sibling = parent.leftNode; - } - - color(sibling, colorOf(parent)); - black(sibling.leftNode); - black(parent); - rotateRight(parent); - } - } - } -// protected void afterRemove(Node node, Node replacement) { -// // 如果删除的节点是红色 -// if (isRed(node)) return; -// -// // 用以取代node的子节点是红色 -// if (isRed(replacement)) { -// black(replacement); -// return; -// } -// -// Node parent = node.parent; -// // 删除的是根节点 -// if (parent == null) return; -// -// // 删除的是黑色叶子节点【下溢】 -// // 判断被删除的node是左还是右 -// boolean left = parent.left == null || node.isLeftChild(); -// Node sibling = left ? parent.right : parent.left; -// if (left) { // 被删除的节点在左边,兄弟节点在右边 -// if (isRed(sibling)) { // 兄弟节点是红色 -// black(sibling); -// red(parent); -// rotateLeft(parent); -// // 更换兄弟 -// sibling = parent.right; -// } -// -// // 兄弟节点必然是黑色 -// if (isBlack(sibling.left) && isBlack(sibling.right)) { -// // 兄弟节点没有1个红色子节点,父节点要向下跟兄弟节点合并 -// boolean parentBlack = isBlack(parent); -// black(parent); -// red(sibling); -// if (parentBlack) { -// afterRemove(parent, null); -// } -// } else { // 兄弟节点至少有1个红色子节点,向兄弟节点借元素 -// // 兄弟节点的左边是黑色,兄弟要先旋转 -// if (isBlack(sibling.right)) { -// rotateRight(sibling); -// sibling = parent.right; -// } -// -// color(sibling, colorOf(parent)); -// black(sibling.right); -// black(parent); -// rotateLeft(parent); -// } -// } else { // 被删除的节点在右边,兄弟节点在左边 -// if (isRed(sibling)) { // 兄弟节点是红色 -// black(sibling); -// red(parent); -// rotateRight(parent); -// // 更换兄弟 -// sibling = parent.left; -// } -// -// // 兄弟节点必然是黑色 -// if (isBlack(sibling.left) && isBlack(sibling.right)) { -// // 兄弟节点没有1个红色子节点,父节点要向下跟兄弟节点合并 -// boolean parentBlack = isBlack(parent); -// black(parent); -// red(sibling); -// if (parentBlack) { -// afterRemove(parent, null); -// } -// } else { // 兄弟节点至少有1个红色子节点,向兄弟节点借元素 -// // 兄弟节点的左边是黑色,兄弟要先旋转 -// if (isBlack(sibling.left)) { -// rotateLeft(sibling); -// sibling = parent.left; -// } -// -// color(sibling, colorOf(parent)); -// black(sibling.left); -// black(parent); -// rotateRight(parent); -// } -// } -// } - - private Node color(Node node, boolean color) { - if (node == null) return node; - ((RBNode)node).color = color; - return node; - } - - private Node red(Node node) { - return color(node, RED); - } - - private Node black(Node node) { - return color(node, BLACK); - } - - private boolean colorOf(Node node) { - return node == null ? BLACK : ((RBNode)node).color; - } - - private boolean isBlack(Node node) { - return colorOf(node) == BLACK; - } - - private boolean isRed(Node node) { - return colorOf(node) == RED; - } - - @Override - protected Node createNode(E element, Node parent) { - return new RBNode<>(element, parent); - } - - private static class RBNode extends Node { - boolean color = RED; - public RBNode(E element, Node parent) { - super(element, parent); - } - - @Override - public String toString() { - String str = ""; - if (color == RED) { - str = "R_"; - } - return str + element.toString(); - } - } -} diff --git "a/\347\272\242\351\273\221\346\240\221/\347\272\242\351\273\221\346\240\221.iml" "b/\347\272\242\351\273\221\346\240\221/\347\272\242\351\273\221\346\240\221.iml" deleted file mode 100644 index c90834f..0000000 --- "a/\347\272\242\351\273\221\346\240\221/\347\272\242\351\273\221\346\240\221.iml" +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git "a/\351\223\276\350\241\250/.gitignore" "b/\351\223\276\350\241\250/.gitignore" deleted file mode 100644 index 173454b..0000000 --- "a/\351\223\276\350\241\250/.gitignore" +++ /dev/null @@ -1,9 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### Example user template template -### Example user template - -# IntelliJ project files -.idea -*.iml -out -gen diff --git "a/\351\223\276\350\241\250/src/com/xhp281/Main.java" "b/\351\223\276\350\241\250/src/com/xhp281/Main.java" deleted file mode 100644 index 61ab355..0000000 --- "a/\351\223\276\350\241\250/src/com/xhp281/Main.java" +++ /dev/null @@ -1,57 +0,0 @@ -package com.xhp281; - -import com.xhp281.circle.CircleDoubleLinkedList; -import com.xhp281.circle.CircleLinkedList; -import com.xhp281.common.List; -import com.xhp281.single.ArrayList; - -import com.xhp281.single.LinkedList; -import com.xhp281.single.LinkedList2; -import com.xhp281.two.DoubleLinkList; - -public class Main { - - /** - * 通用测试方法 - * @param list - */ - static void testList(List list){ - // 添加 - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(0,5); - System.out.println("添加后的列表:" + list.toString()); // [5,1,2,3,4] - - // 删除 - list.remove(1); - System.out.println("第一次删除后的列表:" + list.toString()); // [5,2,3] - list.remove(3); - System.out.println("第二次删除后的列表:" + list.toString()); // [5,2,3] - } - - static void josephus(){ - CircleDoubleLinkedList list = new CircleDoubleLinkedList<>(); - for (int i = 1; i < 9; i++) { - list.add(i); - } - // 指向头结点 - list.reset(); - while (!list.isempty()){ - list.next(); - list.next(); - System.out.println(list.remove()); - } - } - - public static void main(String[] args) { -// testList(new ArrayList<>()); // 数组 -// testList(new LinkedList<>()); // 链表 -// testList(new LinkedList2<>()); // 虚拟头结点 -// testList(new DoubleLinkList<>()); // 双向链表 -// testList(new CircleLinkedList<>()); // 单向循环列表 -// testList(new CircleDoubleLinkedList<>()); // 双向循环列表 - josephus(); // 约瑟夫问题 - } -} diff --git "a/\351\223\276\350\241\250/src/com/xhp281/circle/CircleDoubleLinkedList.java" "b/\351\223\276\350\241\250/src/com/xhp281/circle/CircleDoubleLinkedList.java" deleted file mode 100644 index 1bfce2c..0000000 --- "a/\351\223\276\350\241\250/src/com/xhp281/circle/CircleDoubleLinkedList.java" +++ /dev/null @@ -1,248 +0,0 @@ -package com.xhp281.circle; - -import com.xhp281.common.AbstractList; - -/** - * User: FenDou - * Date: 2019-05-14 14:50 - * Description: 双向循环列表 - */ - -public class CircleDoubleLinkedList extends AbstractList { - private Node first; - private Node last; - private Node current; - - // 内部类 - private static class Node{ - E element; - Node next; - Node prev; - - // 构造方法 - public Node( Node prev,E element, Node next) { - this.element = element; - this.next = next; - this.prev = prev; - } - - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - if (prev != null){ - buffer.append(prev.element); - }else{ - buffer.append("null"); - } - - buffer.append("<——").append(element).append("——>"); - - if (next != null){ - buffer.append(next.element); - }else{ - buffer.append("null"); - } - return buffer.toString(); - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - System.out.println("释放了"); - } - } - - /** - * 清除所有元素 - */ - public void clear(){ - size = 0; - first = null; - last = null; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - - // 往后面添加 - if (index == size){ - Node oldLast = last; - // 更新last为新加入的元素,并设置前后节点 - last = new Node<>(oldLast,element,first); - - // size == 0 的的时候,第一个元素指向自己 - if (oldLast == null){ - first = last; - first.prev = first; - first.next = first; - }else{ - // size > 1 的时候first last要循环指向 - oldLast.next = last; - first.prev = last; - } - }else{ - // 其他位置添加 - Node next = node(index); - Node pre = next.prev; - Node node = new Node<>(pre,element,next); - next.prev = node; - pre.next = node; - - if (index == 0){ // first == next - first = node; - } - } - size++; - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - - Node node = first; - if (element == null){ - for (int i = 0; i < size; i++) { - if (node.element == null) return i; - node = node.next; - } - }else{ - for(int i = 0; i < size; i++){ - if (element.equals(node.element)) return i; - node = node.next; - } - } - return com.xhp281.common.List.ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - return node(index).element; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - Node node = node(index); - E old = node.element; - node.element = element; - return old; - } - - public void reset(){ - current = first; - } - - /** - * 切换下一个元素 - */ - public E next(){ - if (current == null) return null; - current = current.next; - return current.element; - } - - /** - * 删除元素 - * @return - */ - public E remove(){ - if (current == null) return null; - E element = remove(current); - if (size == 0){ - current = null; - }else{ - current = current.next; - } - return element; - } - - /** - * 根据下标删除元素 - */ - public E remove(int index){ - checkRange(index); - return remove(node(index)); - } - - /** - * 删除元素 - * @param node - * @return - */ - public E remove(Node node){ - if (size == 1){ - first = null; - last = null; - }else{ - Node prev = node.prev; - Node next = node.next; - prev.next = next; - next.prev = prev; - - if (node == first){ // index == 0 - first = next; - } - if (node == last){ // index == size - 1 - last = prev; - } - } - size--; - return node.element; - } - - /** - * 根据下标查找对象 - * @param index - * @return - */ - private Node node(int index){ - // 检查下标是不是合理 - checkRange(index); -// 判断位置 - if (index < (size >> 1)){ - Node node = first; - // 从前往后找 - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - }else{ - // 从后往前找 - Node node = last; - for (int i = size - 1; i > index ; i--) { - node = node.prev; - } - return node; - } - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - Node node = first; - - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(node); - }else{ - buffer.append("," + node); - } - node = node.next; - } - buffer.append("]"); - return buffer.toString(); - } -} diff --git "a/\351\223\276\350\241\250/src/com/xhp281/circle/CircleLinkedList.java" "b/\351\223\276\350\241\250/src/com/xhp281/circle/CircleLinkedList.java" deleted file mode 100644 index fe8af80..0000000 --- "a/\351\223\276\350\241\250/src/com/xhp281/circle/CircleLinkedList.java" +++ /dev/null @@ -1,165 +0,0 @@ -package com.xhp281.circle; - -import com.xhp281.common.AbstractList; -import com.xhp281.common.List; - -/** - * User: FenDou - * Date: 2019-05-14 13:44 - * Description: 单向循环列表 - */ - -public class CircleLinkedList extends AbstractList { - private Node first; - - // 内部类 - private static class Node{ - E element; - Node next; - // 构造方法 - public Node(E element, Node next) { - this.element = element; - this.next = next; - } - - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append(element).append("->").append(next.element); - return buffer.toString(); - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - System.out.println("释放了"); - } - } - - /** - * 清除所有元素 - */ - public void clear(){ - size = 0; - first = null; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - - if (index == 0){ - Node newFirst = new Node(element,first); - // 拿到最后一个节点 - Node last = (size == 0) ? newFirst : node(size - 1); - // 设置最后一个节点的下一个节点 - last.next = newFirst; - first = newFirst; - }else{ - Node pre = node(index - 1); - pre.next = new Node<>(element,pre.next); // 设置 index 位置的数据 - } - size++; - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - - Node node = first; - if (element == null){ - for (int i = 0; i < size; i++) { - if (node.element == null) return i; - node = node.next; - } - }else{ - for(int i = 0; i < size; i++){ - if (element.equals(node.element)) return i; - node = node.next; - } - } - return List.ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - return node(index).element; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - Node node = node(index); - E old = node.element; - node.element = element; - return old; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - Node node = first; - if (index == 0){ - if (size == 1){ - first = null; - }else{ - Node last = node(size - 1); - first = first.next; - last.next = first; - } - - }else{ - Node pre = node(index - 1); - node = pre.next; // 获取要删除的元素 - pre.next = node.next; // 修改之前的对象元素指向 index+1 对象 - } - size--; - return node.element; - } - - /** - * 根据下标查找对象 - * @param index - * @return - */ - private Node node(int index){ - // 检查下标是不是合理 - checkRange(index); - Node node = first; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - Node node = first; - - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(node); - }else{ - buffer.append("," + node); - } - node = node.next; - } - buffer.append("]"); - return buffer.toString(); - } -} \ No newline at end of file diff --git "a/\351\223\276\350\241\250/src/com/xhp281/single/ArrayList.java" "b/\351\223\276\350\241\250/src/com/xhp281/single/ArrayList.java" deleted file mode 100644 index 1e55227..0000000 --- "a/\351\223\276\350\241\250/src/com/xhp281/single/ArrayList.java" +++ /dev/null @@ -1,188 +0,0 @@ -package com.xhp281.single; -import com.xhp281.common.AbstractList; - -/** - * User: FenDou - * Date: 2019-05-07 18:28 - * Description: - */ - -public class ArrayList extends AbstractList { - - /** - * 所有元素 - * */ - private E[] elements; - - /** - * 默认大小 - */ - private static final int DEFAULT_CAPACITY = 10; - - /** - * 构造函数 - */ - public ArrayList(int capaticy){ - capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy; - elements = (E[]) new Object[capaticy]; - } - public ArrayList(){ - this(DEFAULT_CAPACITY); - } - - /** - * 清除所有元素 - */ - public void clear(){ - for (int i = 0; i < size; i++) { - elements[i] = null; - } - size = 0; - System.gc(); - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - if (element == null){ - for (int i = 0; i < size; i++) { - if (elements[i] == null) return i; - } - }else{ - for(int i = 0; i < size; i++){ - if (elements[i].equals(element)) return i; - } - } - return ELEMENT_NOT_FOUND; - } - public int indexOf2(E element){ - for (int i = 0; i < size; i++) { - if (valEquals(element,elements[i])) return i; - } - return ELEMENT_NOT_FOUND; - } - - private boolean valEquals(Object v1,Object v2){ - return v1 == null ? v2 == null : v1.equals(v2); - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - checkRange(index); - - return elements[index]; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - checkRange(index); - - E old = elements[index]; - elements[index] = element; - return old; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - - // 容量检查 - updateCapaticy(size + 1); - - for (int i = size; i > index; i--){ - elements[i] = elements[i - 1]; - } - elements[index] = element; - size++; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - - E old = elements[index]; - - // 第一种方式 -// size--; -// for (int i = index; i < size; i++){ -// elements[i] = elements[i + 1]; -// } -// elements[size] = null; - - // 第二种方式 - for (int i = index + 1; i < size; i++) { - elements[i - 1] = elements[i]; - } - elements[--size] = null; - - trim(); - return old; - } - - /** - * 动态扩容 - * @param capaticy - */ - private void updateCapaticy(int capaticy){ - int oldCapaticy = elements.length; - if (oldCapaticy >= capaticy) return; - // 扩容为1.5倍 - int newCapaticy = oldCapaticy + (oldCapaticy >> 1); - E[] newElements = (E[]) new Object[newCapaticy]; - // 移动之前元素 - for (int i = 0; i < size; i++){ - newElements[i] = elements[i]; - } - elements = newElements; - System.out.println(oldCapaticy + "- 扩容为 -" + newCapaticy); - } - - /** - * 动态缩容 - */ - private void trim(){ - // 30 - int oldCapacity = elements.length; - // 15 - int newCapacity = oldCapacity >> 1; - if (size > (newCapacity) || oldCapacity <= DEFAULT_CAPACITY) return; - - // 剩余空间还很多 - E[] newElements = (E[]) new Object[newCapacity]; - for (int i = 0; i < size; i++) { - newElements[i] = elements[i]; - } - elements = newElements; - - System.out.println(oldCapacity + "缩容为" + newCapacity); - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(elements[i]); - }else{ - buffer.append("," + elements[i]); - } - } - buffer.append("]"); - return buffer.toString(); - } -} diff --git "a/\351\223\276\350\241\250/src/com/xhp281/single/LinkedList.java" "b/\351\223\276\350\241\250/src/com/xhp281/single/LinkedList.java" deleted file mode 100644 index 5a6d426..0000000 --- "a/\351\223\276\350\241\250/src/com/xhp281/single/LinkedList.java" +++ /dev/null @@ -1,143 +0,0 @@ -package com.xhp281.single; -import com.xhp281.common.AbstractList; -import com.xhp281.common.List; - -/** - * User: FenDou - * Date: 2019-05-08 10:32 - * Description: - */ - -public class LinkedList extends AbstractList { - private Node first; - // 内部类 - private static class Node{ - E element; - Node next; - // 构造方法 - public Node(E element, Node next) { - this.element = element; - this.next = next; - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - System.out.println("释放了"); - } - } - - /** - * 清除所有元素 - */ - public void clear(){ - size = 0; - first = null; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - if (index == 0){ - first = new Node(element,first); - }else{ - Node pre = node(index - 1); - pre.next = new Node<>(element,pre.next); // 设置 index 位置的数据 - } - size++; - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - - Node node = first; - if (element == null){ - for (int i = 0; i < size; i++) { - if (node.element == null) return i; - node = node.next; - } - }else{ - for(int i = 0; i < size; i++){ - if (element.equals(node.element)) return i; - node = node.next; - } - } - return List.ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - return node(index).element; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - Node node = node(index); - E old = node.element; - node.element = element; - return old; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - Node node = first; - if (index == 0){ - first = first.next; - }else{ - Node pre = node(index - 1); - node = pre.next; // 获取要删除的元素 - pre.next = node.next; // 修改之前的对象元素指向 index+1 对象 - } - size--; - return node.element; - } - - /** - * 根据下标查找对象 - * @param index - * @return - */ - private Node node(int index){ - // 检查下标是不是合理 - checkRange(index); - Node node = first; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - Node node = first; - - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(node.element); - }else{ - buffer.append("," + node.element); - } - node = node.next; - } - buffer.append("]"); - return buffer.toString(); - } -} \ No newline at end of file diff --git "a/\351\223\276\350\241\250/src/com/xhp281/single/LinkedList2.java" "b/\351\223\276\350\241\250/src/com/xhp281/single/LinkedList2.java" deleted file mode 100644 index 2f5633b..0000000 --- "a/\351\223\276\350\241\250/src/com/xhp281/single/LinkedList2.java" +++ /dev/null @@ -1,139 +0,0 @@ -package com.xhp281.single; -import com.xhp281.common.AbstractList; -import com.xhp281.common.List; - -/** - * User: FenDou - * Date: 2019-05-08 10:32 - * Description: 虚拟头结点 - */ - -public class LinkedList2 extends AbstractList { - private Node first; - - public LinkedList2() { - first = new Node<>(null,null); - } - - // 内部类 - private static class Node{ - E element; - Node next; - // 构造方法 - public Node(E element, Node next) { - this.element = element; - this.next = next; - } - @Override - protected void finalize() throws Throwable { - super.finalize(); - System.out.println("释放了"); - } - } - - /** - * 清除所有元素 - */ - public void clear(){ - size = 0; - first = null; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - - Node pre = index == 0 ? first : node(index - 1); - pre.next = new Node<>(element,pre.next); // 设置 index 位置的数据 - size++; - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - - Node node = first.next; - if (element == null){ - for (int i = 0; i < size; i++) { - if (node.element == null) return i; - node = node.next; - } - }else{ - for(int i = 0; i < size; i++){ - if (element.equals(node.element)) return i; - node = node.next; - } - } - return List.ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - return node(index).element; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - Node node = node(index); - E old = node.element; - node.element = element; - return old; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - Node pre = index == 0 ? first : node(index - 1); - Node node = pre.next; // 获取要删除的元素 - pre.next = node.next; // 修改之前的对象元素指向 index+1 对象 - size--; - return node.element; - } - - /** - * 根据下标查找对象 - * @param index - * @return - */ - private Node node(int index){ - // 检查下标是不是合理 - checkRange(index); - Node node = first.next; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - Node node = first.next; - - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(node.element); - }else{ - buffer.append("," + node.element); - } - node = node.next; - } - buffer.append("]"); - return buffer.toString(); - } -} \ No newline at end of file diff --git "a/\351\223\276\350\241\250/src/com/xhp281/two/DoubleLinkList.java" "b/\351\223\276\350\241\250/src/com/xhp281/two/DoubleLinkList.java" deleted file mode 100644 index 5000c34..0000000 --- "a/\351\223\276\350\241\250/src/com/xhp281/two/DoubleLinkList.java" +++ /dev/null @@ -1,204 +0,0 @@ -package com.xhp281.two; -import com.xhp281.common.AbstractList; -import com.xhp281.common.List; - -/** - * User: FenDou - * Date: 2019-05-13 18:10 - * Description: 双向链表 - */ - -public class DoubleLinkList extends AbstractList { - private Node first; - private Node last; - - // 内部类 - private static class Node{ - E element; - Node next; - Node prev; - - // 构造方法 - public Node( Node prev,E element, Node next) { - this.element = element; - this.next = next; - this.prev = prev; - } - - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - if (prev != null){ - buffer.append(prev.element); - }else{ - buffer.append("null"); - } - - buffer.append("<——").append(element).append("——>"); - - if (next != null){ - buffer.append(next.element); - }else{ - buffer.append("null"); - } - return buffer.toString(); - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - System.out.println("释放了"); - } - } - - /** - * 清除所有元素 - */ - public void clear(){ - size = 0; - first = null; - last = null; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - - // 往后面添加 - if (index == size){ - Node oldLast = last; - last = new Node<>(oldLast,element,null); - if (oldLast == null){ - first = last; - }else{ - oldLast.next = last; - } - }else{ - Node next = node(index); - Node pre = next.prev; - Node node = new Node<>(pre,element,next); - next.prev = node; - if (pre == null){ - first = node; - }else{ - pre.next = node; - } - } - size++; - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - - Node node = first; - if (element == null){ - for (int i = 0; i < size; i++) { - if (node.element == null) return i; - node = node.next; - } - }else{ - for(int i = 0; i < size; i++){ - if (element.equals(node.element)) return i; - node = node.next; - } - } - return List.ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - return node(index).element; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - Node node = node(index); - E old = node.element; - node.element = element; - return old; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - - Node node = node(index); - Node prev = node.prev; - Node next = node.next; - - if (prev == null){ - first = next; - }else{ - prev.next = next; - } - - if (next == null){ - last = prev; - }else{ - next.prev = prev; - } - - size--; - - return node.element; - } - - /** - * 根据下标查找对象 - * @param index - * @return - */ - private Node node(int index){ - // 检查下标是不是合理 - checkRange(index); -// 判断位置 - if (index < (size >> 1)){ - Node node = first; - // 从前往后找 - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - }else{ - // 从后往前找 - Node node = last; - for (int i = size - 1; i > index ; i--) { - node = node.prev; - } - return node; - } - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - Node node = first; - - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(node); - }else{ - buffer.append("," + node); - } - node = node.next; - } - buffer.append("]"); - return buffer.toString(); - } -} diff --git "a/\351\230\237\345\210\227/.gitignore" "b/\351\230\237\345\210\227/.gitignore" deleted file mode 100644 index 173454b..0000000 --- "a/\351\230\237\345\210\227/.gitignore" +++ /dev/null @@ -1,9 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### Example user template template -### Example user template - -# IntelliJ project files -.idea -*.iml -out -gen diff --git "a/\351\230\237\345\210\227/src/com/xhp281/circle/CircleDeque.java" "b/\351\230\237\345\210\227/src/com/xhp281/circle/CircleDeque.java" deleted file mode 100644 index eb58eea..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/circle/CircleDeque.java" +++ /dev/null @@ -1,161 +0,0 @@ -package com.xhp281.circle; - -/** - * User: FenDou - * Date: 2019-05-15 17:08 - * Description: 双端循环队列 - */ - -public class CircleDeque { - private int front; - private int size; - private E[] elements; - private static final int DEFAULT_COUNT = 10; - - /** - * 初始化 - */ - public CircleDeque(){ - elements = (E[]) new Object[DEFAULT_COUNT]; - } - - /** - * 获取元素数量 - * @return - */ - public int size(){ - return size; - } - - /** - * 是否为空 - * @return - */ - public boolean isempty(){ - return size == 0; - } - - /** - * 清空队列 - */ - public void clear(){ - for (int i = 0; i < size; i++) { - elements[index(i)] = null; - } - front = 0; - size = 0; - } - - /** - * 头部入队 - * @param element - */ - public void enQueueFront(E element){ - updateCapaticy(size + 1); - - front = index(-1); - elements[front] = element; - size++; - } - - /** - * 尾部入队 - * @param element - */ - public void enQueueRear(E element){ - updateCapaticy(size + 1); - - elements[index(size)] = element; - size++; - } - - /** - * 尾部出队 - */ - public E deQueueRear(){ - int rearIndex = index(size - 1); - E rear = elements[rearIndex]; - elements[rearIndex] = null; - size--; - return rear; - } - - /** - * 头部出队 - */ - public E deQueueFront(){ - E firstElement = elements[front]; - elements[front] = null; - front = index(1); - size--; - return firstElement; - } - - /** - * 头部元素 - * @return - */ - public E front(){ - return elements[front]; - } - - /** - * 尾部元素 - * @return - */ - public E rear(){ - return elements[index(size - 1)]; - } - - /** - * 转换成需要的循环 index - * @param index - * @return - */ - private int index(int index){ - index += front; - if (index < 0){ - return index + elements.length; - } -// return index % elements.length; - return index - (elements.length <= index ? elements.length : 0); - } - - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("capcacity = ").append(elements.length) - .append(" front = " + front) - .append(" size = " + size) - .append(", list = ["); - - for (int i = 0; i < elements.length ; i++){ - if (i == 0){ - buffer.append(elements[i]); - }else{ - buffer.append("," + elements[i]); - } - } - buffer.append("]"); - return buffer.toString(); - } - - /** - * 动态扩容 - * @param capaticy - */ - private void updateCapaticy(int capaticy){ - int oldCapaticy = elements.length; - if (oldCapaticy >= capaticy) return; - // 扩容为1.5倍 - int newCapaticy = oldCapaticy + (oldCapaticy >> 1); - E[] newElements = (E[]) new Object[newCapaticy]; - // 移动之前元素 - for (int i = 0; i < size; i++){ - newElements[i] = elements[index(i)]; - } - elements = newElements; - // 重置头 - front = 0; - } -} diff --git "a/\351\230\237\345\210\227/src/com/xhp281/circle/CircleQueue.java" "b/\351\230\237\345\210\227/src/com/xhp281/circle/CircleQueue.java" deleted file mode 100644 index 037f9ca..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/circle/CircleQueue.java" +++ /dev/null @@ -1,119 +0,0 @@ -package com.xhp281.circle; - -import java.util.Objects; - -/** - * User: FenDou - * Date: 2019-05-15 17:08 - * Description: 循环队列 - */ - -public class CircleQueue { - private int front; - private int size; - private E[] elements; - private static final int DEFAULT_COUNT = 10; - - public CircleQueue(){ - elements = (E[]) new Object[DEFAULT_COUNT]; - } - - /** - * 获取元素数量 - * @return - */ - public int size(){ - return size; - } - - /** - * 是否为空 - * @return - */ - public boolean isempty(){ - return size == 0; - } - - /** - * 清空队列 - */ - public void clear(){ - for (int i = 0; i < size; i++) { - elements[index(i)] = null; - } - front = 0; - size = 0; - } - - /** - * 入队 - * @param element - */ - public void enQueue(E element){ - updateCapaticy(size + 1); - elements[index(size)] = element; - size++; - } - - /** - * 出队 - * @return - */ - public E deQueue(){ - E elementFront = elements[front]; - elements[front] = null; - front = index(1); - size--; - return elementFront; - } - - public E front(){ - return elements[front]; - } - - public int index(int index){ - index += front; -// return index % elements.length; -// 优化:n % m == n - (m >= n ? 0 : m) 前提:n < 2m -// n = 10 -// m = 13 - return index - (elements.length >= index ? 0 : elements.length); - } - - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("front = " + front) - .append(" size = " + elements.length) - .append(", list = ["); - - for (int i = 0; i < elements.length ; i++){ - if (i == 0){ - buffer.append(elements[i]); - }else{ - buffer.append("," + elements[i]); - } - } - buffer.append("]"); - return buffer.toString(); - } - - /** - * 动态扩容 - * @param capaticy - */ - private void updateCapaticy(int capaticy){ - int oldCapaticy = elements.length; - if (oldCapaticy >= capaticy) return; - // 扩容为1.5倍 - int newCapaticy = oldCapaticy + (oldCapaticy >> 1); - E[] newElements = (E[]) new Object[newCapaticy]; - // 移动之前元素 - for (int i = 0; i < size; i++){ - newElements[i] = elements[index(i)]; - } - elements = newElements; - // 重置头 - front = 0; - } -} diff --git "a/\351\230\237\345\210\227/src/com/xhp281/common/AbstractList.java" "b/\351\230\237\345\210\227/src/com/xhp281/common/AbstractList.java" deleted file mode 100644 index 28b71ef..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/common/AbstractList.java" +++ /dev/null @@ -1,77 +0,0 @@ -package com.xhp281.common; - -/** - * User: FenDou - * Date: 2019-05-07 18:47 - * Description: - */ - -public abstract class AbstractList implements List { - - /** - * 元素数量 - * */ - public int size; - - /** - * 获取元素数量 - * @return - */ - public int size(){ - return size; - } - - /** - * 是否为空 - * @return - */ - public boolean isempty(){ - return size == 0; - } - - /** - * 是不是包含某个元素 - * @param element - * @return - */ - public boolean contains(E element){ - return indexOf(element) != List.ELEMENT_NOT_FOUND; - } - - /** - * 添加数据尾部 - * @param element - */ - public void add(E element){ - add(size,element); - } - - /** - * 抛出错误 - * @param index - */ - protected void outOfBound(int index){ - throw new IndexOutOfBoundsException("Index is " + index + ", size is " + size); - } - - /** - * 检查范围 - * @param index - */ - protected void checkRange(int index){ - if (index < 0 || index >= size){ - outOfBound(index); - } - } - - /** - * 检测添加的范围 - * @param index - */ - protected void cheakAddRange(int index){ - if (index < 0 || index > size){ - outOfBound(index); - } - } - -} diff --git "a/\351\230\237\345\210\227/src/com/xhp281/common/ArrayList.java" "b/\351\230\237\345\210\227/src/com/xhp281/common/ArrayList.java" deleted file mode 100644 index 920e0e9..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/common/ArrayList.java" +++ /dev/null @@ -1,177 +0,0 @@ -package com.xhp281.common; - -/** - * User: FenDou - * Date: 2019-05-07 18:28 - * Description: - */ - -public class ArrayList extends AbstractList { - - /** - * 所有元素 - * */ - private E[] elements; - - /** - * 默认大小 - */ - private static final int DEFAULT_CAPACITY = 10; - - /** - * 构造函数 - */ - public ArrayList(int capaticy){ - capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy; - elements = (E[]) new Object[capaticy]; - } - public ArrayList(){ - this(DEFAULT_CAPACITY); - } - - /** - * 清除所有元素 - */ - public void clear(){ - for (int i = 0; i < size; i++) { - elements[i] = null; - } - size = 0; - System.gc(); - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - if (element == null){ - for (int i = 0; i < size; i++) { - if (elements[i] == null) return i; - } - }else{ - for(int i = 0; i < size; i++){ - if (elements[i].equals(element)) return i; - } - } - return ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - checkRange(index); - - return elements[index]; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - checkRange(index); - - E old = elements[index]; - elements[index] = element; - return old; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - - // 容量检查 - updateCapaticy(size + 1); - - for (int i = size; i > index; i--){ - elements[i] = elements[i - 1]; - } - elements[index] = element; - size++; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - - E old = elements[index]; - - // 第一种方式 -// size--; -// for (int i = index; i < size; i++){ -// elements[i] = elements[i + 1]; -// } -// elements[size] = null; - - // 第二种方式 - for (int i = index + 1; i < size; i++) { - elements[i - 1] = elements[i]; - } - elements[--size] = null; - - trim(); - return old; - } - - /** - * 动态扩容 - * @param capaticy - */ - private void updateCapaticy(int capaticy){ - int oldCapaticy = elements.length; - if (oldCapaticy >= capaticy) return; - // 扩容为1.5倍 - int newCapaticy = oldCapaticy + (oldCapaticy >> 1); - E[] newElements = (E[]) new Object[newCapaticy]; - // 移动之前元素 - for (int i = 0; i < size; i++){ - newElements[i] = elements[i]; - } - elements = newElements; - System.out.println(oldCapaticy + "- 扩容为 -" + newCapaticy); - } - - /** - * 动态缩容 - */ - private void trim(){ - // 30 - int oldCapacity = elements.length; - // 15 - int newCapacity = oldCapacity >> 1; - if (size > (newCapacity) || oldCapacity <= DEFAULT_CAPACITY) return; - - // 剩余空间还很多 - E[] newElements = (E[]) new Object[newCapacity]; - for (int i = 0; i < size; i++) { - newElements[i] = elements[i]; - } - elements = newElements; - - System.out.println(oldCapacity + "缩容为" + newCapacity); - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(elements[i]); - }else{ - buffer.append("," + elements[i]); - } - } - buffer.append("]"); - return buffer.toString(); - } -} diff --git "a/\351\230\237\345\210\227/src/com/xhp281/common/LinkedList.java" "b/\351\230\237\345\210\227/src/com/xhp281/common/LinkedList.java" deleted file mode 100644 index 7896f2d..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/common/LinkedList.java" +++ /dev/null @@ -1,141 +0,0 @@ -package com.xhp281.common; - -/** - * User: FenDou - * Date: 2019-05-08 10:32 - * Description: - */ - -public class LinkedList extends AbstractList { - private Node first; - // 内部类 - private static class Node{ - E element; - Node next; - // 构造方法 - public Node(E element, Node next) { - this.element = element; - this.next = next; - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - System.out.println("释放了"); - } - } - - /** - * 清除所有元素 - */ - public void clear(){ - size = 0; - first = null; - } - - /** - * 添加到指定位置 - */ - public void add(int index,E element){ - cheakAddRange(index); - if (index == 0){ - first = new Node(element,first); - }else{ - Node pre = node(index - 1); - pre.next = new Node<>(element,pre.next); // 设置 index 位置的数据 - } - size++; - } - - /** - * 判断元素下标 - */ - public int indexOf(E element){ - - Node node = first; - if (element == null){ - for (int i = 0; i < size; i++) { - if (node.element == null) return i; - node = node.next; - } - }else{ - for(int i = 0; i < size; i++){ - if (element.equals(node.element)) return i; - node = node.next; - } - } - return List.ELEMENT_NOT_FOUND; - } - - /** - * 根据下标获取元素 - */ - public E get(int index){ - return node(index).element; - } - - /** - * 设置index位置的元素 - */ - public E set(int index,E element){ - Node node = node(index); - E old = node.element; - node.element = element; - return old; - } - - /** - * 删除元素 - */ - public E remove(int index){ - checkRange(index); - Node node = first; - if (index == 0){ - first = first.next; - }else{ - Node pre = node(index - 1); - node = pre.next; // 获取要删除的元素 - pre.next = node.next; // 修改之前的对象元素指向 index+1 对象 - } - size--; - return node.element; - } - - /** - * 根据下标查找对象 - * @param index - * @return - */ - private Node node(int index){ - // 检查下标是不是合理 - checkRange(index); - Node node = first; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - /** - * 打印字符串 - * @return - */ - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("size = " + size); - buffer.append(", list = ["); - Node node = first; - - for (int i = 0; i < size ; i++){ - if (i == 0){ - buffer.append(node.element); - }else{ - buffer.append("," + node.element); - } - node = node.next; - } - buffer.append("]"); - return buffer.toString(); - } -} \ No newline at end of file diff --git "a/\351\230\237\345\210\227/src/com/xhp281/common/List.java" "b/\351\230\237\345\210\227/src/com/xhp281/common/List.java" deleted file mode 100644 index f28f13e..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/common/List.java" +++ /dev/null @@ -1,54 +0,0 @@ -package com.xhp281.common; - -/** - * User: FenDou - * Date: 2019-05-07 18:16 - * Description: 接口 - */ - -public interface List { - - /** - * 未找到 - */ - static final int ELEMENT_NOT_FOUND = -1; - - /** - * 清除所有元素 - */ - public void clear(); - - /** - * 获取元素数量 - */ - public int size(); - /** - * 是否为空 - */ - public boolean isempty(); - - /** - * 判断元素下标 - */ - public int indexOf(E element); - /** - * 根据下标获取元素 - */ - public E get(int index); - /** - * 设置index位置的元素 - */ - public E set(int index,E element); - /** - * 添加到指定位置 - */ - public void add(int index,E element); - /** - * 插入尾部 - */ - public void add(E element); - /** - * 删除元素 - */ - public E remove(int index); -} diff --git "a/\351\230\237\345\210\227/src/com/xhp281/queue/Deque.java" "b/\351\230\237\345\210\227/src/com/xhp281/queue/Deque.java" deleted file mode 100644 index 40084fe..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/queue/Deque.java" +++ /dev/null @@ -1,88 +0,0 @@ -package com.xhp281.queue; - -import com.xhp281.common.LinkedList; -import com.xhp281.common.List; - -/** - * User: FenDou - * Date: 2019-05-15 15:26 - * Description: 双端队列 - */ - -public class Deque { - private List list = new LinkedList<>(); - - /** - * 获取元素数量 - * @return - */ - public int size(){ - return list.size(); - } - - /** - * 是否为空 - * @return - */ - public boolean isempty(){ - return list.isempty(); - } - - /** - * 清空队列 - */ - public void clear(){ - list.clear(); - } - - /** - * 尾部入队 - * @param element - */ - public void enQueueRear(E element){ - list.add(element); - } - - /** - * 尾部出队 - */ - public E deQueueRear(){ - return list.remove(list.size() - 1); - } - - /** - * 头部入队 - * @param element - */ - public void enQueueFront(E element){ - list.add(0,element); - } - - /** - * 头部出队 - */ - public E deQueueFront(){ - return list.remove(0); - } - - /** - * 头部元素 - * @return - */ - public E front(){ - return list.get(0); - } - - /** - * 尾部元素 - * @return - */ - public E rear(){ - return list.get(size() - 1); - } - - @Override - public String toString() { - return list.toString(); - } -} diff --git "a/\351\230\237\345\210\227/src/com/xhp281/queue/Queue.java" "b/\351\230\237\345\210\227/src/com/xhp281/queue/Queue.java" deleted file mode 100644 index 58777f6..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/queue/Queue.java" +++ /dev/null @@ -1,66 +0,0 @@ -package com.xhp281.queue; - -import com.xhp281.common.LinkedList; -import com.xhp281.common.List; - -/** - * User: FenDou - * Date: 2019-05-15 14:39 - * Description: 队列 - */ - -public class Queue{ - private List list = new LinkedList<>(); - - /** - * 获取元素数量 - * @return - */ - public int size(){ - return list.size(); - } - - /** - * 是否为空 - * @return - */ - public boolean isempty(){ - return list.isempty(); - } - - /** - * 清空队列 - */ - public void clear(){ - list.clear(); - } - - /** - * 进队 - * @param element - */ - public void enQueue(E element){ - list.add(element); - } - - /** - * 出队 - * @return - */ - public E deQueue(){ - return list.remove(0); - } - - /** - * 获取第一个元素 - * @return - */ - public E front(){ - return list.get(0); - } - - @Override - public String toString() { - return list.toString(); - } -} diff --git "a/\351\230\237\345\210\227/src/com/xhp281/test/Main.java" "b/\351\230\237\345\210\227/src/com/xhp281/test/Main.java" deleted file mode 100644 index 5bb2391..0000000 --- "a/\351\230\237\345\210\227/src/com/xhp281/test/Main.java" +++ /dev/null @@ -1,101 +0,0 @@ -package com.xhp281.test; - -import com.xhp281.circle.CircleDeque; -import com.xhp281.circle.CircleQueue; -import com.xhp281.queue.Deque; -import com.xhp281.queue.Queue; - -/** - * User: FenDou - * Date: 2019-05-15 14:43 - * Description: - */ - -public class Main { - - /** - * 队列 - */ - static void QueueTest(){ - Queue quque = new Queue<>(); - quque.enQueue(1); - quque.enQueue(2); - quque.enQueue(3); - quque.enQueue(4); - - System.out.println("队列:" + quque.toString()); - System.out.println("第一个元素:" + quque.front()); - - while (!quque.isempty()){ - System.out.println("出队:" + quque.deQueue()); - } - } - - /** - * 双端队列 - */ - static void DequeTest(){ - Deque deque = new Deque<>(); - deque.enQueueRear(1); - deque.enQueueRear(2); - deque.enQueueRear(3); - deque.enQueueFront(100); - deque.enQueueFront(200); - deque.enQueueFront(300); - - System.out.println(deque.toString()); // [300 200 100 1 2 3] - deque.deQueueFront(); - System.out.println(deque.toString()); // [200 100 1 2 3] - deque.deQueueRear(); - System.out.println(deque.toString()); // [200 100 1 2 ] - System.out.println("第一个元素:" + deque.front()); - System.out.println("最后一个元素:" + deque.rear()); - } - - /** - * 循环队列 - */ - static void CircleQueueTest(){ - CircleQueue queue = new CircleQueue(); - for (int i = 0; i < 10; i++) { - queue.enQueue(i); - } - for (int i = 0; i < 5; i++) { - System.out.println(queue.deQueue()); // [300 200 100 1 2 3] - } - for (int i = 95; i < 100; i++) { - queue.enQueue(i); - } - - System.out.println(queue.toString()); // [300 200 100 1 2 3] - System.out.println("第一个元素:" + queue.front()); - } - - /** - * 双端循环队列 - */ - static void CircleDequeTest(){ - CircleDeque queue = new CircleDeque<>(); - - for (int i = 0; i < 10; i++) { - queue.enQueueFront(i + 1); - queue.enQueueRear(i + 100); - } - - for (int i = 0; i < 3; i++) { - queue.deQueueFront(); - queue.deQueueRear(); - } - queue.enQueueFront(11); - queue.enQueueFront(12); - - System.out.println(queue.toString()); - System.out.println("第一个元素:" + queue.front()); - } - public static void main(String[] args){ -// QueueTest(); // 队列 -// DequeTest(); // 双端队列 -// CircleQueueTest(); // 循环队列 - CircleDequeTest(); // 双端循环队列 - } -} diff --git "a/\351\233\206\345\220\210/.idea/misc.xml" "b/\351\233\206\345\220\210/.idea/misc.xml" deleted file mode 100644 index 0548357..0000000 --- "a/\351\233\206\345\220\210/.idea/misc.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/\351\233\206\345\220\210/.idea/modules.xml" "b/\351\233\206\345\220\210/.idea/modules.xml" deleted file mode 100644 index 308fc10..0000000 --- "a/\351\233\206\345\220\210/.idea/modules.xml" +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git "a/\351\233\206\345\220\210/.idea/vcs.xml" "b/\351\233\206\345\220\210/.idea/vcs.xml" deleted file mode 100644 index 6c0b863..0000000 --- "a/\351\233\206\345\220\210/.idea/vcs.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/\351\233\206\345\220\210/.idea/workspace.xml" "b/\351\233\206\345\220\210/.idea/workspace.xml" deleted file mode 100644 index 9a3e08f..0000000 --- "a/\351\233\206\345\220\210/.idea/workspace.xml" +++ /dev/null @@ -1,620 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - this - null - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -