第三章 树(解决查找问题)
树是对链表的优化:
1、对于大量的输入数据,链表的线性访问时间太慢,不宜使用。
2、解决链表类的查找和排序的问题。
处理特殊领域的数据,会有出奇的高效率。快速搜索。
数据结构不光解决的是数据的存储问题,更重要的是在特定情况使用某种特定的数据结构可以解决高效的搜索问题。
树结构可以解决链表的线性访问时间效率的问题。说白了就是对链表作的一层优化方案。可以把时间复杂度降到O(logN)
一、二叉树(基础)
1)有唯一的根节点
2)每个节点最多有两个孩子,left、right
3)每个节点都有一个父节点,除根节点之外。
4)没有任何孩子的节点叫做根节点。
5)二叉树具有天然的递归结构
6)二叉树不一定是满的。
二、二分搜索树
1、特性
1)二分搜索树是一个二叉树(不一定都是满的)
2)特殊:它和普通的二叉树不同,它的每个节点的值必须是可比较的。(元素可比较性)
3)特殊:每个节点的值大于左子树所有节点的值,小于其右子树所有节点的值
4)满足上面的特性也就是说二分搜索树的每一棵子树也都是二分搜索树。
2、解决的问题
由于它有可比较性,所以查询一个值,就相当于每次都二分查找。大于节点的值去它右子树查询,小于节点的值去左子树中查找。可以大大提高查找的效率。
3、添加元素
1)添加元素的过程是一个不断比较的过程。大于比较节点的值就去右子树继续比较,小于节点的值就去左子树继续比较。直到我们找到一个null节点。那么插入就去就好。这个就是一个递归的过程。
2)有个特殊就是相等。(set因为我们实现的是set的接口,所以我们实现的二分搜索树对相等的情况不作处理。)
3)代码讲解:
@Override
public boolean add(E value) {
root = add(root, value);
return true;
}
private Node add(Node node, E value) {
if (node == null) {
//找到合适的位置进行插入操作
size++;
return new Node(value);
}
// else if (value.equals(node.value)) {
// //遇到相等的值,不做任务处理
// return node;
// }
//---------下面是不断的查找的过程-------------
int compareResult = value.compareTo(node.value);
if (compareResult < 0) {
//添加节点发生改变,要建立关联关联
node.left = add(node.left, value);
} else if (compareResult > 0) {
node.right = add(node.right, value);
}
//-----------逐层返回节点,最终到最顶次层调用---------------------
return node;
}
4、查找元素
@Override
public boolean contains(E value) {
return contains(root, value);
}
pri