静态表查找
1.顺序查找:
算法描述:从表中的第一个或者是最后一个记录开始,逐个的将表中记录的关键字和给定值进行比较。若某个记录的关键字和给定值相等,则查找成功;若表中所有记录的关键字和给定值都不相等,则查找失败。
算法实现:
public class OrderSearch {
public static void main(String[] args) {
int[] table = {1,23,4,5,6};
System.out.println(OrderSearch.orderSearch(table, 5));
}
public static boolean orderSearch(int[] table,int keyWord){
for(int i = 0;i<table.length;i++){
if(table[i] == keyWord){
return true;
}
}
return false;
}
}
2. 折半查找(二分查找,针对有序序列)
算法描述:折半查找的前提条件是在一个有序的序列中。首先确定待查记录所在的区间,然后逐步的缩小范围区间直到找到或者找不到该记录为止。与数学中的二分法一样。
算法实现(递归版):
public class BinarySearch {
public static void main (String[] args){
// TODO Auto-generated method stub
int[] Arr={1,2,3,4,5,6,7,8,9};
System.out.println(binarySearch(Arr,10,0,Arr.length-1)); }
//递归
public static int binarySearch(int[] Arr,int key,int low,in thigh){
while(low<=high){
int mid=(low+high)/2;
if(key==Arr[mid]){
return mid;
} else if(key <Arr[mid]){
return binarySearch(Arr,key,low,mid-1);
} else{
return binarySearch(Arr,key,mid+1,high);
}
}
return -1;
}
}
非递归版:
public class BinarySearch{
public static void main(String[] args){
// TODO Auto-generated method stub
int[] Arr={1,2,3,4,5,6,7,8,9};
System.out.println(binarySearch(Arr,11));
}
public static int binarySearch(int[] Arr, int key){
int low=0;
int high=Arr.length-1;
while(low<=high){
int mid=(low+high)/2;
if(key==Arr[mid]){
return mid;
}else if(key <Arr[mid]){
high=mid-1;
} else{
low=mid+1;
}
}
return -1;
}
}
动态表查找
二叉排序树(二叉查找树):
1.定义:二叉排序树或者是空树,或者是具有下列性质的一颗树:
若他的左子树不为空,则左子树上所有结点的值均小于其根节点的值
若他的右子树不为空,则右子树上所有结点的值均大于其根节点的值
他的左右子树也均是二叉排序树
2.二叉排序树的性质
按中序遍历二叉排序树,所得到的中序遍历序列是一个递增有序序列。
3.二叉排序树的插入
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。
插入过程:
若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;
当非空时,将待插结点关键字S->key和树根关键字t->key进行比较,若s->key = t->key,则无须插入,若s->key< t->key,则插入到根的左子树中,若s->key> t->key,则插入到根的右子树中。而子树中的插入过程和在树中的插入过程相同,如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。
4.二叉排序树的查找
假定二叉排序树的根结点指针为 root ,给定的关键字值为 K ,则查找算法可描述为:
① 置初值: q = root ;
② 如果 K = q -> key ,则查找成功,算法结束;
③ 否则,如果 K < q -> key ,而且 q 的左子树非空,则将 q 的左子树根送 q ,转步骤②;否则,查找失败,结束算法;
④ 否则,如果 K > q -> key ,而且 q 的右子树非空,则将 q 的右子树根送 q ,转步骤②;否则,查找失败,算法结束。
5.二叉排序树的删除
假设被删结点是*p,其双亲是*f,不失一般性,设*p是*f的左孩子,下面分三种情况讨论:
⑴ 若结点*p是叶子结点,则只需修改其双亲结点*f的指针即可。
⑵ 若结点*p只有左子树PL或者只有右子树PR,则只要使PL或PR 成为其双亲结点的左子树即可。
⑶ 若结点*p的左、右子树均非空,先找到*p的中序前趋(或后继)结点*s(注意*s是*p的左子树中的最右下的结点,它的右链域为空),然后有两种做法:① 令*p的左子树直接链到*p的双亲结点*f的左链上,而*p的右子树链到*p的中序前趋结点*s的右链上。② 以*p的中序前趋结点*s代替*p(即把*s的数据复制到*p中),将*s的左子树链到*s的双亲结点*q的左(或右)链上。
6、二叉树的遍历
二叉树的遍历有三种方式,如下:
(1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树。简记根-左-右。
(2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树。简记左-根-右。
(3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点。简记左-右-根。