package com.aaront.exercise.basic; public class BinaryTree { private BinaryTreeNode head = new BinaryTreeNode(null); private BinaryTreeNode root; private int size; private int index = 0; public static final int PREORDER = 0; public static final int INORDER = 1; public static final int POSTORDER = 2; public static final int HIERARCHICAL = 3; public static final int RECURSION = 10; public static final int ITERATION = 11; public void add(Integer o) { BinaryTreeNode node = new BinaryTreeNode(o); if (root == null) { root = node; head.setLeft(root); } else { insert(root, node); } size++; } private void insert(BinaryTreeNode node, BinaryTreeNode newNode) { // 要插入的节点插入当前节点的左子树 if (node.getData() > newNode.getData()) { if (node.getLeft() == null) { node.setLeft(newNode); } else { insert(node.left, newNode); } } else { // 要插入的节点插入当前节点的右子树 if (node.getRight() == null) { node.setRight(newNode); } else { insert(node.right, newNode); } } } public BinaryTreeNode search(int data) { return search(data, ITERATION); } public BinaryTreeNode search(int data, int method) { switch (method) { case RECURSION: return findNodeRecursion(root, data); case ITERATION: return findNodeIteration(data); default: throw new IllegalArgumentException("不支持的查找方法"); } } private BinaryTreeNode findNodeRecursion(BinaryTreeNode node, int data) { if (node == null) return null; if (node.getData() == data) return node; if (node.getData() > data) return findNodeRecursion(node.getLeft(), data); return findNodeRecursion(node.getRight(), data); } private BinaryTreeNode findNodeIteration(int data) { BinaryTreeNode currentNode = root; while (currentNode != null) { if (currentNode.getData() == data) { return currentNode; } if (currentNode.getData() > data) { currentNode = currentNode.getLeft(); } else { currentNode = currentNode.getRight(); } } return null; } public BinaryTreeNode min() { return findMin(root); } private BinaryTreeNode findMin(BinaryTreeNode node) { if (node == null) return null; if (node.getLeft() == null) return node; return findMin(node.getLeft()); } public BinaryTreeNode max() { return findMax(root); } private BinaryTreeNode findMax(BinaryTreeNode node) { if (node == null) return null; if (node.getRight() == null) return node; return findMax(node.getRight()); } public void delete(Integer data) { BinaryTreeNode node = search(data); if (node == null) return; BinaryTreeNode parentNode = searchParentNode(node); if (parentNode == null) return; // 删除叶子节点 if (node.getLeft() == null && node.getRight() == null) { if (parentNode.getLeft() == node) parentNode.setLeft(null); else parentNode.setRight(null); } else if (node.getLeft() != null && node.getRight() == null) { // 删除只有左子树的节点 if (parentNode.getLeft() == node) parentNode.setLeft(node.getLeft()); else parentNode.setRight(node.getLeft()); } else if (node.getRight() != null && node.getLeft() == null) { // 删除只有右子树的节点 if (parentNode.getLeft() == node) parentNode.setLeft(node.getRight()); else parentNode.setRight(node.getRight()); } else { // 删除有两个子树的节点 BinaryTreeNode replace = findMin(node.getRight()); BinaryTreeNode replaceParentNode = searchParentNode(replace); replaceParentNode.setLeft(replace.getRight()); node.setData(replace.getData()); replace.setLeft(null); replace.setRight(null); } size--; } private BinaryTreeNode searchParentNode(BinaryTreeNode node) { if (node == null) return null; if (node == root) return head; BinaryTreeNode current = root; while (current != null) { if (current.getLeft() == node || current.getRight() == node) return current; if (current.getData().compareTo(node.getData()) > 0) current = current.getLeft(); else current = current.getRight(); } return null; } public int[] traversal() { return traversal(PREORDER); } public int[] traversal(int order) { int[] datas = new int[size]; if (order == PREORDER) { preorderTraversal(root, datas); } else if (order == INORDER) { inorderTraversal(root, datas); } else if (order == POSTORDER) { postorderTraversal(root, datas); } else { hierarchicalTraversal(root, datas); } index = 0; return datas; } private void preorderTraversal(BinaryTreeNode node, int[] datas) { if (node == null) { return; } datas[index++] = node.getData(); preorderTraversal(node.getLeft(), datas); preorderTraversal(node.getRight(), datas); } private void inorderTraversal(BinaryTreeNode node, int[] datas) { if (node == null) { return; } inorderTraversal(node.getLeft(), datas); datas[index++] = node.getData(); inorderTraversal(node.getRight(), datas); } private void postorderTraversal(BinaryTreeNode node, int[] datas) { if (node == null) { return; } postorderTraversal(node.getLeft(), datas); postorderTraversal(node.getRight(), datas); datas[index++] = node.getData(); } private void hierarchicalTraversal(BinaryTreeNode node, int[] datas) { if (node == null) return; Queue queue = new Queue(); queue.enQueue(node); while (!queue.isEmpty()) { BinaryTreeNode tmp = (BinaryTreeNode) queue.deQueue(); datas[index++] = tmp.getData(); if (tmp.getLeft() != null) queue.enQueue(tmp.getLeft()); if (tmp.getRight() != null) queue.enQueue(tmp.getRight()); } } public class BinaryTreeNode { private Integer data; private BinaryTreeNode left; private BinaryTreeNode right; public BinaryTreeNode(Integer data) { this.data = data; } public Integer getData() { return data; } public void setData(Integer data) { this.data = data; } public BinaryTreeNode getLeft() { return left; } public void setLeft(BinaryTreeNode left) { this.left = left; } public BinaryTreeNode getRight() { return right; } public void setRight(BinaryTreeNode right) { this.right = right; } } }