6.1树结构
二分搜索树(Bianary Search Tree)
平衡二叉树:AVL、红黑树
堆、并查集
线段树、Trie(字典树、前缀树)
二叉树
天然递归结构
二分搜索树Binary Search Tree
1,是二叉树
2,每个节点值:大于左子树所有节点,小于右字数所有节点
3,存储的元素必须有可比较性
构建代码
public class BST <E extends Comparable<E>>{ //**必须有可比较性**
private class Node{
public E e;
public Node left,right;
public Node(E e){//构造函数
this.e=e;
left=null;
right=null;
}
}
private Node root;//根节点
private int size ;//二分搜素数存了多少个元素
public BST() {
root =null;
size=0;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size==0;
}
}
二分搜索树添加元素
//向二分搜索竖中添加新元素e
public void add(E e) {
if(root==null) {
root =new Node(e);
}
else {
add(root,e);
}
}
//向以node为根的二分搜索树中插入元素e 递归
private void add(Node node , E e) {
if(e.equals(node.e)) {//终止条件比较多,较为臃肿
return;
}else if(e.compareTo(node.e)<0&&node.left==null) {//插入元素小于根节点
node.left=new Node(e);
size++;
return;
}
else if(e.compareTo(node.e)>0&&node.right==null) {
node.right=new Node(e);
size++;
return;
}
if(e.compareTo(node.e)<0) //开始递归
add(node.left,e);
else
add(node.right,e);
}
优化添加操作,深入理解递归终止条件
//向以node为根的二分搜索树中插入元素e 递归
//返回插入新节点后二分搜索树的根
public void add(E e) {
root=add(root,e);
}
private Node add(Node node,E e) {//返回Node类型的值
if(node==null) { //求解最基本问题
size++;
return new Node(e);
}
if(e.compareTo(node.e)<0)
node.left=add(node.left,e);//左节点为递归值
else if(e.compareTo(node.e)>0)
node.right=add(node.right,e);
return node; //返回根节点
}
二分搜索树的查询(简单,找到就好了,不用想怎么挂接到树上)
private boolean contains(Node node , E e) {
if(node==null) {
return false;
}
if(e.compareTo(node.e)==0)
return true;
else if(e.compareTo(node.e)<0)
return contains(node.left,e);
else
return contains(node.right,e);
}