FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

GitHub Viewer

package tree; import com.tree.Tree; import java.util.LinkedList; import java.util.Optional; import java.util.Queue; import java.util.Stack; /** * @author xjn * @since 2020-05-07 */ public class AVLTree implements Tree { private class Node { public E e; public Node left; public Node right; public int height; public Node(E e) { this.e = e; this.left = this.right = null; this.height = 1; } public Node(Node node) { this.e = node.e; this.left = node.left; this.right = node.right; this.height = node.height; } @Override public String toString() { return e.toString(); } } private Node root; private int size; public AVLTree() { this.root = null; this.size = 0; } private int getHeight(Node node) { if (node == null) { return 0; } return node.height; } private int getBalanceFactor(Node node) { if (node == null) { return 0; } return getHeight(node.left) - getHeight(node.right); } public boolean isAVL() { return isAVL(this.root); } private boolean isAVL(Node node) { if (node == null) { return true; } int leftHeight = getHeight(node.left); int rightHeight = getHeight(node.right); if (Math.abs(leftHeight - rightHeight) > 1) { return false; } return isAVL(node.left) && isAVL(node.right); } @Override public boolean isEmpty() { return size == 0; } @Override public int getSize() { return this.size; } @Override public void add(E e) { } private Node addRecursive(Node node, E e) { if (node == null) { node = new Node(e); size++; return node; } if (node.e.compareTo(e) < 0) { node.left = addRecursive(node.left, e); } else if (node.e.compareTo(e) > 0) { node.right = addRecursive(node.right, e); } //更新height node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right)); //平衡因子 int balanceFactory = getBalanceFactor(node); //RR if (balanceFactory > 1 && getBalanceFactor(node.left) >= 0) { return rotateRight(node); } //LL if (balanceFactory < -1 && getBalanceFactor(node.right) 1 && getBalanceFactor(node.left) < 0) { node.left = rotateLeft(node.left); return rotateRight(node); } //RL if (balanceFactory < -1 && getBalanceFactor(node.right) > 0) { node.right = rotateRight(node.right); return rotateLeft(node); } return node; } private Node rotateRight(Node y) { Node x = y.left; Node t3 = x.right; x.right = y; y.left = t3; y.height = Math.max(getHeight(y.left), getHeight(y.right)) + 1; x.height = Math.max(getHeight(x.right), getHeight(x.left)) + 1; return x; } private Node rotateLeft(Node y) { Node x = y.right; Node t3 = x.left; x.left = y; y.right = t3; y.height = Math.max(getHeight(y.left), getHeight(y.right)) + 1; x.height = Math.max(getHeight(x.left), getHeight(x.right)) + 1; return x; } @Override public boolean contains(E e) { return false; } private boolean containsRecursive(Node node, E e) { if (node == null) { return false; } if (node.e.compareTo(e) == 0) { return true; } else if (node.e.compareTo(e) > 0) { return containsRecursive(node.left, e); } else { return containsRecursive(node.right, e); } } @Override public void preOrder() { preOrder(root); } private void preOrder(Node node) { if (node == null) { return; } System.out.print(node); preOrder(node.left); preOrder(node.right); } @Override public void inOrder() { inOrder(root); } private void inOrder(Node node) { if (node == null) { return; } preOrder(node.left); System.out.print(node); preOrder(node.right); } @Override public void postOrder() { postOrder(root); } private void postOrder(Node node) { if (node == null) { return; } postOrder(node.left); postOrder(node.right); System.out.print(node); } @Override public void bfs() { Queue queue = new LinkedList(); queue.add(root); while (!queue.isEmpty()) { Node node = queue.remove(); System.out.print(node + " "); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } } @Override public void dfs() { Stack stack = new Stack(); stack.push(root); while (!stack.isEmpty()) { Node nodeFromStack = stack.pop(); System.out.print(nodeFromStack.e + " "); if (nodeFromStack.right != null) { stack.push(nodeFromStack.right); } if (nodeFromStack.left != null) { stack.push(nodeFromStack.left); } } } @Override public int getTreeDepth() { return getTreeDepth(root); } private int getTreeDepth(Node node) { if (node == null) { return 0; } int left = getTreeDepth(node.left) + 1; int right = getTreeDepth(node.right) + 1; return Math.max(left, right); } @Override public E maximum() { return maximum(root).e; } private Node maximum(Node node) { if (node == null || node.left == null) { return node; } return maximum(node.left); } @Override public E minimum() { return minimum(root).e; } private Node minimum(Node node) { if (node == null || node.right == null) { return node; } return minimum(node.right); } @Override public E removeMaximum() { E e = maximum(); root = removeMaximum(root); return e; } private Node removeMaximum(Node node) { if (node.left == null) { size--; return node.right; } node.left = removeMaximum(node.left); return node; } @Override public E removeMinimum() { return null; } private Node removeMinimum(Node node) { if (node.right == null) { size--; return node.left; } node.right = removeMinimum(node.right); return node; } @Override public void remove(E e) { } private Node remove(Node node, E e) { if (node == null) { return null; } Node retNode = null; if (node.e.compareTo(e) < 0) { node.left = remove(node.left, e); retNode = node; } else if (node.e.compareTo(e) > 0) { node.right = remove(node.right, e); retNode = node; } //找到删除的位置 node //左子树为空 if (node.left == null) { Node rightNode = node.right; node.right = null; size--; retNode = rightNode; } else if (node.right == null) { //右子树为空 Node leftNode = node.left; node.left = null; size--; retNode = leftNode; } else { //左右子树不为空 Node successor = minimum(node.right); successor.left = node.left; successor.right = removeMinimum(node.right); node.left = node.right = null; retNode = successor; } if (retNode == null) { return null; } //更新height retNode.height = Math.max(getHeight(retNode.right), getHeight(retNode.left)) + 1; //计算平衡因子 int balanceFactor = getBalanceFactor(retNode); //右旋 if (balanceFactor > 1 && getBalanceFactor(retNode.left) >= 0) { return rotateRight(retNode); } //左旋 if (balanceFactor < -1 && getBalanceFactor(retNode.right) 1 && getBalanceFactor(retNode.left) < 0) { retNode.left = rotateLeft(retNode.left); return rotateRight(retNode); } //RL if (balanceFactor < -1 && getBalanceFactor(retNode.right) > 0) { retNode.right = rotateRight(retNode.right); return rotateLeft(retNode); } return retNode; } private void writeArray(Node node, int rowIndex, int columnIndex, String[][] res, int treeDepth) { //输入的树不为空 if (node == null) { return; } //当前节点保存到二维数组中 res[rowIndex][columnIndex] = String.valueOf(node.e); //当前节点位于树的第几层 int currLevel = (rowIndex + 1) / 2; //如果到了最后一行,则返回 if (currLevel == treeDepth) { return; } // 计算当前行到下一行,每个元素之间的间隔(下一行的列索引与当前元素的列索引之间的间隔) int gap = treeDepth - currLevel - 1; // 对左儿子进行判断,若有左儿子,则记录相应的"/"与左儿子的值 if (node.left != null) { res[rowIndex + 1][columnIndex - gap] = "/"; writeArray(node.left, rowIndex + 2, columnIndex - gap * 2, res, treeDepth); } // 对右儿子进行判断,若有右儿子,则记录相应的"\"与右儿子的值 if (node.right != null) { res[rowIndex + 1][columnIndex + gap] = "\\"; writeArray(node.right, rowIndex + 2, columnIndex + gap * 2, res, treeDepth); } } private String show(Node node) { StringBuilder builder = new StringBuilder(); if (root == null) { return "EMPTY!"; } int treeDepth = getTreeDepth(); // 最后一行的宽度为2的(n - 1)次方乘3,再加1 // 作为整个二维数组的宽度 int arrayHeight = treeDepth * 2 - 1; int arrayWidth = (2 1 && i 4 ? 2 : line[i].length() - 1; } } builder.append(sb.toString() + "\n"); } return builder.toString(); } }

Back | FazBrowse Home | New Git URL