二叉搜索树:二叉搜索树的数据结构特点是一个父节点的左孩子都比这个父节点的值要小,右孩子节点上的值都比这个父节点的值要大。二分搜索树的常用遍历方法有前序遍历,中序遍历,后序遍历。如果用递归的方法进行遍历的话,就是输出语句在递归前的位置,因为如果用递归的话,每个节点都会访问三次,而不同的遍历方式就是在第几次访问这个节点时进行输出。中序遍历其实就是按照从小到大的顺序进行输出。一个完全二叉搜索树的排序的时间复杂度是O(logn)。这比在数组或者链表进行查找元素O(n)要快的多。如果数据不合适,二叉搜索树可能退化为数组或者链表。
public class Node {
public int val;
public Node left ;
public Node right;
public Node(int val,Node left,Node right) {
this.val = val;
this.left = left;
this.right = right;
}
public Node(int val) {
this(val,null,null);
}
}
public class Tree {
private Node root;
public Tree() {
root = null;
}
private int size;
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public void add(int val) {
root = insert(val, root);
}
private Node insert(int val,Node root) {
if(root == null) {
size++;
return new Node(val);
}
int temp = root.val;
if(val<temp) {
root.left = insert(val,root.left);
}
else if(val > temp) {
root.right = insert(val,root.right);
}
return root;
}
public boolean contains(int val) {
return contains(val,root);
}
private boolean contains(int val,Node root) {
if(root == null) {
return false;
}
int temp = root.val;
if(temp < val) {
return contains(val,root.left);
}
else if(temp > val) {
return contains(val,root.right);
}
return true;
}
public int findMin() {
if(root == null) {
throw new IllegalArgumentException("空树");
}
return findMin(root).val;
}
private Node findMin(Node root) {
if(root.left == null) {
return root;
}
return findMin(root.left);
}
public int findMax() {
if(root == null) {
throw new IllegalArgumentException("空树");
}
return findMax(root).val;
}
private Node findMax(Node root) {
if(root.right == null) {
return root;
}
return findMax(root.right);
}
public void remove(int val) {
if(root == null) {
return ;
}
remove(val,root);
}
private Node remove(int val,Node root) {
if(root == null) {
throw new IllegalArgumentException("没有找到要删除的数");
}
int temp = root.val;
if(val < temp ) {
root.left = remove(val,root.left);
}
else if(val > temp) {
root.right = remove(val,root.right);
}
else if(root.left!= null && root.right != null) {
root.val = findMin(root.right).val;
root.right = remove(root.val,root.right);
}
else {
root = (root.left !=null)?root.left :root.right;
size--;
}
return root;
}