啊啊啊啊啊啊這一章真的是搞了好久啊 今天狀態賊差 腦子疼痛 特別困和疲累
唉,該寫的作業還得寫該考的考試還得考 今天我想早點休息啊
(1)對 22 個記錄的有序表作折半查找,當查找失敗時,至少需要
比較( )次關鍵字。
A.3 B.4 C.5 D.6
答案:B
解釋:22 個記錄的有序表,其折半查找的判定樹深度
為 5,且該判定樹不是滿二叉樹,即查找失敗時至多比
較 5 次,至少比較 4 次
`(2)試寫出折半查 [算法描述]
int BinSrch(rectype r[ ],int k,low,high)//在長為 n 的有序表中查找關鍵字 k,若查找成功,返回 k 所在位置,查找失敗返回 0。
{
if(low≤high) //low 和 high 分別是有序表的下界和上界
{mid=(low+high)/2;
if(r[mid].key==k)return (mid);
else if(r[mid].key>k)return (BinSrch(r,k,mid+1,high));
else return (BinSrch(r,k,low,mid-1));
}
else return (0);//查找失敗。
}//算法結束 `
`(3)試寫一個判別給定二叉樹是否為二叉排序樹的算法
#define true 1
#define false 0
typedef struct node
{datatype data; struct node *lchild,*rchild;} *BTree;
void JudgeBST(BTree T,int flag)
// 判斷二叉樹是否是二叉排序樹,本算法結束后,在調用程序中由flag 得出結論。
{ if(T!=null && flag)
{ Judgebst(T->lchild,flag);// 中序遍歷左子樹
if(pre==null)pre=T;// 中序遍歷的第一個結點不必判斷
else if(pre->data<T->data)pre=T;//前驅指針指向當前結點
else{flag=flase;} //不是完全二叉樹
Judgebst (T->rchild,flag);// 中序遍歷右子樹
}//JudgeBST 算法結束 `
(4)已知二叉樹 T 的結點形式為(lling,data,count,rlink),在
樹中查找值為 X 的結點,若找到,則記數(count)加 1,否則,作
為一個新結點插入樹中,插入后仍為二叉排序樹,寫出其非遞歸算
法。
`void SearchBST(BiTree &T,int target){
BiTree s,q,f; //以數據值 target,新建結點 s
s=new BiTNode;
s->data.x=target;
s->data.count=0;
s->lchild=s->rchild=NULL;
if(!T){
T=s;
return ;
} //如果該樹為空則跳出該函數
f=NULL;
q=T;
while (q){
if (q->data.x==target){
q->data.count++;
return ;
} //如果找到該值則計數加一
f=q;
if (q->data.x>target) //如果查找值比目標值大,則為
該樹左孩子
q=q->lchild;
else //否則為右孩子
q=q->rchild;
} //將新結點插入樹中
if(f->data.x>target)
f->lchild=s;
else
f->rchild=s;
} `
(5)假設一棵平衡二叉樹的每個結點都表明了平衡因子 b,試設計
一個算法,求平衡二叉樹的高度
`int Height(BSTree t)// 求平衡二叉樹 t 的高度
{level=0;p=t;
while(p)
{level++; // 樹的高度增 1
if(p->bf<0)p=p->rchild;//bf=-1 沿右分枝向下
//bf 是平衡因子,是二叉樹 t 結點的一個域
else p=p->lchild; //bf>=0 沿左分枝向下
}//while
return (level);//平衡二叉樹的高度
} //算法結束 `
(6)分別寫出在散列表中插入和刪除關鍵字為 K 的一個記錄的算
法,設散列函數為 H,解決沖突的方法為鏈地址法
`bool insert(){
int data;
cin>>data;
int ant=hash(data);
LinkList p=HT[ant]; //初始化散列表
while (p->next){
if(p->next->data==data)
return false;
p=p->next;
} //找到插入位置
LinkList s;
s=new LNode;
s->data=data;
s->next=p->next;
p->next=s; //插入該結點
return true;
}
bool deletes(){
int data;
cin>>data;
int ant=hash(data);
LinkList p=HT[ant]; //初始化散列表
while (p->next){
if(p->next->data==data){
LinkList s=p->next;
p->next=s->next;
delete s; //刪除該結點
return true;
} //找到刪除位置
p=p->next; //遍歷下一個結點
}
return false;}`