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 21a68fa..0000000 Binary files "a/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/ArrayList.class" and /dev/null differ diff --git "a/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Assert.class" "b/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Assert.class" deleted file mode 100644 index cdfd13f..0000000 Binary files "a/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Assert.class" and /dev/null differ 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 a766ed8..0000000 Binary files "a/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Main.class" and /dev/null differ 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 c1486de..0000000 Binary files "a/\345\212\250\346\200\201\346\225\260\347\273\204/bin/com/xhp/Person.class" and /dev/null differ 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 8f0ef21..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/FileInfo.class" and /dev/null differ diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/Files$1.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/Files$1.class" deleted file mode 100644 index 1eb4bac..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/Files$1.class" and /dev/null differ diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/Files.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/Files.class" deleted file mode 100644 index c967b65..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/file/Files.class" and /dev/null differ 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 8bee946..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/Map$Visitor.class" and /dev/null differ 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 bf1279a..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/Map.class" and /dev/null differ diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/TreeMap$Node.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/TreeMap$Node.class" deleted file mode 100644 index e2268d7..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/TreeMap$Node.class" and /dev/null differ 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 2836f23..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/map/TreeMap.class" and /dev/null differ 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 788bf84..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/Set$Visitor.class" and /dev/null differ 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 fdff30c..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/Set.class" and /dev/null differ diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/TreeSet$1.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/TreeSet$1.class" deleted file mode 100644 index 9953049..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/TreeSet$1.class" and /dev/null differ 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 fcdbda0..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/set/TreeSet.class" and /dev/null differ 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 a4d2b4b..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$1.class" and /dev/null differ 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 07051ff..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$2.class" and /dev/null differ 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 7780454..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test$3.class" and /dev/null differ diff --git "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test.class" "b/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test.class" deleted file mode 100644 index 309de6d..0000000 Binary files "a/\346\230\240\345\260\204/out/production/\346\230\240\345\260\204/com/xhp281/test.class" and /dev/null differ diff --git "a/\346\230\240\345\260\204/src/com/xhp281/file/FileInfo.java" "b/\346\230\240\345\260\204/src/com/xhp281/file/FileInfo.java" deleted file mode 100755 index 4ee1ca1..0000000 --- "a/\346\230\240\345\260\204/src/com/xhp281/file/FileInfo.java" +++ /dev/null @@ -1,47 +0,0 @@ -package com.xhp281.file; - -public class FileInfo { - private int lines; - private int files; - private String content = ""; - - public String[] words() { - return content.split("[^a-zA-Z]+"); - } - - public int getFiles() { - return files; - } - - public void setFiles(int files) { - this.files = files; - } - - public int getLines() { - return lines; - } - - public void setLines(int lines) { - this.lines = lines; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public FileInfo append(FileInfo info) { - if (info != null && info.lines > 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -