1.折半查找算法
1)問題描述:從鍵盤讀入一串整數和一個待查關鍵字,查找在該整數串中是否有這個待查關鍵字。如果有,輸出它在整數串中的位置;如果沒有,輸出-1
2)實驗要求:
- 利用折半查找算法查找
- 用遞歸和非遞歸兩種方式實現折半查找算法
3) 實現提示:
- 遞歸實現參考書上折半查找算法的實現
- 非遞歸算法利用棧實現
#include<iostream>
#include<algorithm>
using namespace std;
int search(int s[],int key,int n){
int low=1,high=n;
int mid;
while(low<=high){
mid = (low+high)/2;
if(s[mid] == key) return mid;
else if(key<s[mid]){
high = mid - 1;
}
else low = mid + 1;
}
return -1;
}
int main(){
int s[100],s1[100],i=1,k,n,n1;
cout<<"輸入元素個數和要查找元素"<<endl;
cin>>n>>k;
n1=n;
while(n1--){
cin>>s[i++];
s1[i-1] = s[i-1];
}
sort(s1+1,s1+n+1);
n1 = search(s1,k,n);
cout<<"查找結果:"<<endl;
if(n1==-1) cout<<-1;
else{
for(i=1;i<=n;i++){
if(s1[n1] == s[i]){
cout<<i;
}
}
}
return 0;
}
2.構造二叉排序樹,並進行中序遍歷
1)問題描述:從鍵盤讀入一串整數構造一棵二叉排序樹,並對得到的二叉排序樹進行中序遍歷,得到有序序列。
2)實驗要求:該二叉排序樹以二叉鏈表存儲
3)實現提示:二叉排序樹的構成,可從空的二叉樹開始,每輸入一個結點數據,就建立一個新結點插入到當前已生成的二叉排序樹中,所以它的主要操作是二叉排序樹插入運算。在二叉排序樹中插入新結點,只要保證插入後仍符合二叉排序樹的定義即可。
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct BiTree{
int data;
BiTree* lchild;
BiTree* rchild;
};
typedef BiTree* BT;
void insert(BT &T,int k){
if(T==NULL){
T = (BiTree*)malloc(sizeof(BiTree));
T->data = k;
T->lchild = T->rchild = NULL;
}
else if(k<=T->data) insert(T->lchild,k);
else if(k>T->data) insert(T->rchild,k);
}
int count=0,count1=1;
void inOrder(BiTree* T){
if(T == NULL) return;
inOrder(T->lchild);
if(count<count1){
cout<<T->data<<" ";
count++;
}
else{
cout<<T->data;
}
inOrder(T->rchild);
}
int main(){
BiTree* T = NULL; int k;
cin>>k;
while(k!=-1){
insert(T,k);
cin>>k;
count1++;
}
cout<<"中序遍歷結果爲:"<<endl;
inOrder(T);
return 0;
}
3. 對於給定的一個有序序列,創建一顆高度最小的二叉排序樹。
1)實驗要求:該二叉排序樹以二叉鏈表存儲
2)實驗提示:要創建一顆高度最小的二叉排序樹,就必須讓左右子樹的節點個數越接近越好。由於給定的是一個關鍵字有序序列a[start..end],所以讓其中間位置的關鍵字a[mid]作爲根結點,左序列a[start..mid-1]構造左子樹,右序列a[mid+1..end]構造右子樹。
#include <iostream>
#define LH 1
#define EH 0
#define RH -1
using namespace std;
typedef struct AVLNode{
int data;
int bf;
AVLNode *lchild;
AVLNode *rchild;
}AVLNode,*AVLTree;
int H(AVLTree &T,int height)
{
if(T==NULL) return 0;
else{
height=max(H(T->lchild,height),H(T->rchild,height))+1;
return height;
}
}
void rotate_left(AVLTree &p)
{
AVLTree rightchild=p->rchild;
p->rchild=rightchild->lchild;
rightchild->lchild=p;
p=rightchild;
}
void rotate_right(AVLTree &p)
{
AVLTree leftchild=p->lchild;
p->lchild=leftchild->rchild;
leftchild->rchild=p;
p=leftchild;
}
void LR(AVLTree &p)
{
rotate_left(p->lchild);
rotate_right(p);
}
void RL(AVLTree &p)
{
rotate_right(p->rchild);
rotate_left(p);
}
void LeftBalance(AVLTree &p)
{
AVLTree lchild = p->lchild;
AVLTree rchild = NULL;
switch(lchild->bf)
{
case LH:
p->bf=lchild->bf=EH;
rotate_right(p);
break;
case EH:
break;
case RH:
rchild=lchild->rchild;
switch(rchild->bf)
{
case LH:
p->bf=RH;
lchild->bf=EH;
break;
case EH:
p->bf=lchild->bf=EH;
break;
case RH:
p->bf=EH;
lchild->bf=LH;
break;
}
rchild->bf=EH;
rotate_left(p->lchild);
rotate_right(p);
}
}
void RightBalance(AVLTree &p)
{
AVLTree rchild=p->rchild;
AVLTree lchild=NULL;
switch(rchild->bf)
{
case RH:
p->bf=rchild->bf=EH;
rotate_left(p);
break;
case EH:
break;
case LH:
lchild=rchild->lchild;
switch(lchild->bf)
{
case LH:
p->bf=EH;
rchild->bf=RH;
break;
case EH:
p->bf=rchild->bf=EH;
break;
case RH:
p->bf=LH;
rchild->bf=EH;
break;
}
lchild->bf=EH;
rotate_right(p->rchild);
rotate_left(p);
}
}
int InsertAVL(AVLTree &T,int e,int &taller)
{
if(!T)
{
T=new AVLNode;
T->data=e;
T->lchild=T->rchild=NULL;
T->bf=EH;
taller=1;
}
else if(e==T->data)
{
taller=0;
return 0;
}
else if(e<T->data){
if(!InsertAVL(T->lchild,e,taller))
return 0;
if(taller)
switch(T->bf){
case LH:
LeftBalance(T);
taller=0;
break;
case EH:
T->bf=LH;
taller=1;
break;
case RH:
T->bf=EH;
taller=0;
break;
}
}
else if(e>T->data)
{
if(!InsertAVL(T->rchild,e,taller))
return 0;
if(taller)
switch(T->bf)
{
case RH:
RightBalance(T);
taller=0;
break;
case EH:
T->bf=RH;
taller=1;
break;
case LH:
T->bf=EH;
taller=0;
break;
}
}
return 1;
}
int main()
{
AVLTree T = NULL;
int t,k,t1=0;
cin>>k;
while(k!=-1)
{
InsertAVL(T,k,t);
cin>>k;
}
cout<<"最小高度爲:"<<endl;
cout<<H(T,t1);
return 0;
}