结构
- 二分搜索树也叫二分查找树
- 是在二叉树上做限制:左孩子小于当前节点的值,右孩子大于当前节点的值
MyBinarySearchTree
package BinarySearchTree;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class BinarySearch<T extends Comparable<T>> {
class Node {
T val;
Node left;
Node right;
public Node(T val) {
this.val = val;
this.left = this.right = null;
}
}
private Node root;
int size;
public BinarySearch() {
this.root = null;
}
public boolean isEmpty() {
return this.root == null;
}
public void add(T ele) {
root = add(root, ele);
this.size++;
}
private Node add(Node root, T ele) {
if (root == null) {
return new Node(ele);
}
if (ele.compareTo(root.val) > 0) {
root.right = add(root.right, ele);
} else {
root.left = add(root.left, ele);
}
return root;
}
public Node contains(T ele) {
return contains(root, ele);
}
private Node contains(Node root, T ele) {
if (root == null) {
return null;
}
T val = root.val;
if (ele.compareTo(val) == 0) {
return root;
} else if (ele.compareTo(val) > 0) {
return contains(root.right, ele);
} else {
return contains(root.left, ele);
}
}
public List<T> middleOrder() {
List<T> result = new ArrayList<>();
middleOrder(root, result);
return result;
}
private void middleOrder(Node root, List<T> result) {
if (root == null) {
return;
}
middleOrder(root.left, result);
result.add(root.val);
middleOrder(root.right, result);
}
public List<T> preOrder() {
List<T> result = new ArrayList<>();
preOrder(root, result);
return result;
}
private void preOrder(Node root, List<T> result) {
if (root == null) {
return;
}
result.add(root.val);
preOrder(root.left, result);
preOrder(root.right, result);
}
public List<T> subOrder() {
List<T> result = new ArrayList<>();
subOrder(root, result);
return result;
}
private void subOrder(Node root, List<T> result) {
if (root == null) {
return;
}
subOrder(root.left, result);
subOrder(root.right, result);
result.add(root.val);
}
public List<T> layerOrder() {
List<T> list = new ArrayList<>();
if (root != null) {
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
Node node = queue.poll();
list.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return list;
}
public T findMixNode() {
if (root == null) {
return null;
}
Node curNode = root;
while (curNode.left != null) {
curNode = curNode.left;
}
return curNode.val;
}
public T findMixNodeDG() {
if (root == null) {
return null;
}
return findMixNodeDG(root).val;
}
private Node findMixNodeDG(Node root) {
if (root.left == null) {
return root;
}
return findMixNodeDG(root.left);
}
private void removeMixNode() {
T mixNodeVal = findMixNodeDG();
if (mixNodeVal == null) {
System.out.println("the tree is empty");
return;
}
System.out.println("Find mixNode value is " + mixNodeVal.toString());
root = removeMixNode(root);
this.size -= 1;
}
private Node removeMixNode(Node node) {
if (node.left == null) {
Node rightNode = node.right;
node.right = null;
return rightNode;
}
node.left = removeMixNode(node.left);
return node;
}
public void removeNode(T val) {
if (root == null) {
System.out.println("The tree is null");
return;
}
Node node = findNodeDG(root, val);
if (node != null) {
root = removeNode(root, val);
this.size -= 1;
}
}
private Node removeNode(Node node, T val) {
if (node.val.compareTo(val) == 0) {
if (node.left == null) {
Node rightNode = node.right;
node.right = null;
return rightNode;
} else if (node.right == null) {
Node leftNode = node.left;
node.left = null;
return leftNode;
} else {
Node s = findMixNodeDG(node.right);
Node rightRoot = removeMixNode(node.right);
s.left = node.left;
s.right = rightRoot;
node.left = node.right = null;
return s;
}
}
if (node.val.compareTo(val) > 0) {
node.left = removeNode(node.left, val);
} else {
node.right = removeNode(node.right, val);
}
return node;
}
private Node findNodeDG(Node node, T val) {
if (node == null) {
return null;
}
if (node.val.compareTo(val) == 0) {
return node;
} else if (node.val.compareTo(val) > 0) {
return findNodeDG(node.left, val);
} else {
return findNodeDG(node.right, val);
}
}
public int getSize() {
return this.size;
}
@Override
public String toString() {
List<T> list = this.middleOrder();
StringBuilder sb = new StringBuilder();
list.forEach(item -> sb.append(item + " "));
return sb.toString();
}
}