在数据结构中,二叉树是一种比较常见的树结构。在有的应用场景下,为什么要使用二查搜索树呢?使用二查搜索树可以给我们带来什么好处呢?
比如我们做查询操作时,数组的查询插入或者删除的最坏的时间复杂度是O(n)
当我们把这个数组进行排序以后,查询的最坏时间复杂度为o(log n),但是插入和删除元素的时间复杂度依然没有发生变化。
二叉搜素树的查询插入和删除的最坏时间复杂度都为o(log n),所以使用二叉搜索树可以大大的提高效率。
二叉搜索树服从以下的规则:
任意一个节点的值都大于左子树节点的值
任意一个节点的值都小于右子树节点的值
每个节点的左右子树依然是一颗二叉搜索树
package com.BinarySearchTree;
import java.util.ArrayList;
public class BinarySearchTree {
public static void main(String[] args) {
BinarySearchTree binarySearchTree = new BinarySearchTree();
binarySearchTree.add(7);
binarySearchTree.add(4);
binarySearchTree.add(9);
binarySearchTree.add(2);
binarySearchTree.add(5);
binarySearchTree.add(8);
binarySearchTree.add(11);
binarySearchTree.add(1);
binarySearchTree.add(3);
binarySearchTree.add(12);
binarySearchTree.print();
}
private int size;//记录集合的大小
private Node root;//树的根节点
public void add(Integer val){
if(val == null){
throw new IllegalArgumentException("val must not null");
}
if (size == 0 || root == null){//第一次插入,设置根节点
root = new Node(val,null);//初始化根节点
size++;
}else{
Node parent = root;//记录父节点
Node node = root;
int cmp = 0;
while (node != null){//把值放到合适的位置
parent = node;
cmp = val - node.integer;
if(cmp > 0){
node = node.right;
}else if(cmp < 0){
node = node.left;
}else{
return;
}
}
if(cmp > 0){
parent.right = new Node(val,parent);
}else if(cmp < 0){
parent.left = new Node(val,parent);
}
}
}
/**
* 集合的容量
* @return
*/
public int size(){
return size;
}
/**
* 清除所有节点
*/
public void clear(){
}
/**
* 层级遍历
*/
public void print() {
ArrayList<Node> list = new ArrayList<>();
ArrayList<Integer> valList = new ArrayList<>();
list.add(root);//根节点入队
valList.add(root.integer);
int i = 0;
while (i < list.size()){
Node node = list.get(i);
if(node.left != null){
list.add(node.left);
valList.add(node.left.integer);
}
if(node.right != null){
list.add(node.right);
valList.add(node.right.integer);
}
i++;
}
System.out.println(valList);
}
private static class Node{
Integer integer;
Node left;
Node right;
Node parent;
public Node(Integer integer, Node parent) {
this.integer = integer;
this.parent = parent;
}
}
}