1.需求分析:在n个动态的整数中搜索某个整数?
解决的方案:
1.1动态数组:平均时间复杂度为O(n);
1.2维护一个有序的动态数组,使用二分搜索最坏时间复杂度为O(log n),添加与删除的时间复杂度为O(n);
1.3使用二分搜索树,最坏的时间复杂度为O(log n)
2.二分搜索树的特点及优点
2.1特点:任意一个节点值小于所有右子树节点的值,大于所有左子树节点的值
存储的元素必须具有比较性(如果是自定义类型,需要指定比较的方式)
2.2优点:可以大大提高搜索数据的效率
3.接口实现
int size();//元素数量
boolean isEmpty(); //是否为空
void clear(); //清空所有元素
void add(); //添加元素
void delete();//删除元素
void contain();//是否包含元素
注意:此处的二叉树并未使用索引;
原因:因为二叉搜索树添加元素的顺序与节点的位置无关,并不适合用索引
4.添加元素
首先判断根节点是否为空,如果不为空,先添加根节点;
根节点不为空时添加元素,首先要找到添加位置的根节点,并且判断添加元素与根节点的大小,创建新节点,如果大于,则添加到右子树的节点上;反之则添加到左子树的节点上;
size++;
public void add(int element){
// elementIsnull(element);
if(root==null){
root=new Node(element,null);
size++;
return;
}
Node node=root;
Node newParent=root;//记录父亲节点
int state=0;//记录一下元素与结点的比较结果;0代表元素大于节点值。1代表相反结果
while (node!=null){
newParent=node;
if(element>node.element){
node=node.right;
state=0;
}else if(element<node.element){
node=node.left;
state=1;
}else {
node.element=element;
return;
}
}
Node newNode=new Node(element,newParent);
if(state==0){
newParent.right=newNode;
}else {
newParent.left=newNode;
}
size++;
}
5.二叉树的前序遍历 (注意所有二叉树)
遍历顺序:遍历根节点——前序遍历左子树节点——前序遍历右子树节点(递归实现)
public void preorderTraversal(Node root){
if(root==null){
return;
}
// 首先遍历根节点
System.out.println(root.element);
// 其次前序遍历左子树
preorderTraversal(root.left);
// 最后前序遍历右子树
preorderTraversal(root.right);
}
遍历结果: