import java.util.Random; /** * 二叉搜索树 * * @author Ckenny * */ public class Tree { /** * 根节点 */ private Node root; /** * 查找节点 * * @param key * 查找的关键字 * @return 关键字所在节点 */ public Node find(int key) { Node currentNode = root; while (currentNode.i != key) { if (key > currentNode.i) { currentNode = currentNode.rightNode; } else { currentNode = currentNode.leftNode; } if (null == currentNode) { return null; } } return currentNode; } /** * 查找最大的节点 * * @return 最大的节点 */ public Node findMax() { Node currentNode = root; while (null != currentNode.rightNode) { currentNode = currentNode.rightNode; } return currentNode; } /** * 查找最小的节点 * * @return 最小的节点 */ public Node findMin() { Node currentNode = root; while (null != currentNode.leftNode) { currentNode = currentNode.leftNode; } return currentNode; } /** * 遍历树 * * @param node */ public void traverse(Node node) { if (null != node) { traverse(node.leftNode); System.out.println(node.i); traverse(node.rightNode); } } /** * 插入节点 * * @param node * 需要插入的节点 */ public void insert(Node node) { if(node == null) return; if (null == root) { root = node; } else { Node currentNode = root; while (true) { if (currentNode.i > node.i) { if (null == currentNode.leftNode) { currentNode.leftNode = node; return; } else { currentNode = currentNode.leftNode; } } else { if (null == currentNode.rightNode) { currentNode.rightNode = node; return; } else { currentNode = currentNode.rightNode; } } } } } /** * 获得父节点 * * @param node * 原节点 * @return 原节点的父节点 */ public Node getParentNode(Node node) { if(node==null) return null; Node parentNode = root; System.out.println("parentNode:" + parentNode.i); while (true) { if (parentNode.leftNode.equals(node) || parentNode.rightNode.equals(node)) { return parentNode; } else if (parentNode.leftNode.i > node.i) { parentNode = parentNode.leftNode; } else { parentNode = parentNode.rightNode; } } } /** * 获得后继节点 * * @param node * 原节点 * @return 原节点的后继节点 */ public Node getSuccessorNode(Node node) { Node SuccessorNode = node.rightNode; while (SuccessorNode.leftNode != null) { SuccessorNode = SuccessorNode.leftNode; } return SuccessorNode; } /** * 删除节点 * * @param deleteNode * 要删除的节点 */ public void deleteNode(Node deleteNode) { if(deleteNode==null) return; if (deleteNode.equals(root)) { root = null; } else { Node leftNode = deleteNode.leftNode; Node rightNode = deleteNode.rightNode; Node parentNode = getParentNode(deleteNode); if (parentNode.leftNode == deleteNode) { if (null == leftNode && null == rightNode) { parentNode.leftNode = null; } else if (null != leftNode && null != rightNode) { Node successorNode = getSuccessorNode(deleteNode); getParentNode(successorNode).leftNode = successorNode.rightNode; parentNode.leftNode = successorNode; successorNode.leftNode = leftNode; successorNode.rightNode = rightNode; } else { parentNode.leftNode = null == leftNode ? rightNode : leftNode; } } else { if (null == leftNode && null == rightNode) { parentNode.rightNode = null; } else if (null != leftNode && null != rightNode) { Node successorNode = getSuccessorNode(deleteNode); getParentNode(successorNode).leftNode = successorNode.rightNode; parentNode.leftNode = successorNode; successorNode.leftNode = leftNode; successorNode.rightNode = rightNode; } else { parentNode.rightNode = null == leftNode ? rightNode : leftNode; } } } } /** * 按关键字删除节点 * * @param key * 要删除节点的关键字 */ public void deleteNode(int key) { deleteNode(find(key)); } public static void main(String[] args) { Tree tree = new Tree(); Random r = new Random(); for (int i = 0; i < 50; i++) { Node node = new Node(); node.i = r.nextInt(100); tree.insert(node); } tree.traverse(tree.root); tree.deleteNode(50); System.out.println("max:" + tree.findMax().i); tree.traverse(tree.root); System.out.println("min:" + tree.findMin().i); } } /** * 节点 * * @author Ckenny */ class Node { int i; Node leftNode; Node rightNode; }