演算法如下:
# define listsze 20
typedef struct
elemtype;
typedef struct
stable;
查詢過程:
int searchseq(stable st,keytype k)
//在順序表中查詢關鍵字等於k的元素,若找到則函式值為該元素在表中的位置,否則為0
asl=1/2(n+1)
演算法:int binsearch(stable st,keytype)
//在有序表中st中折半查詢器關鍵字等於key的元素,若找到則函式值為該元素在表中的位置
return(0); }
asl=log
2(n+1)-1
2.1 二叉排序樹
typedef struct node
bstnode,*bstee;
查詢演算法:
bstree searchbst(bstree bt, keytype key)
//在根指標bt所指二叉樹排列數中,查詢關鍵字等於key的元素,若查詢成功則返回指向該元素的指標,否則則返回空指標
2.2二叉排序樹的插入
演算法:void insertbst(bstree*bt,keytype key)
else
if(key<(*bt)->key)
insertbst(&((*bt)->lchild),key);
else if(key>(*bt)->key)
insertbst(&((*bt)->rchild),key); }
如果給定乙個元素序列,可以利用二叉樹排序的插入演算法,動態構造一棵二叉排序樹。
首先,將二叉排序樹初始化為一棵空樹,然後逐個讀入元素,每讀入乙個元素,就建立一
個新的結點,並插入到當前已生成的二叉排序樹中,即呼叫上述二叉排序樹的插入演算法將
新結點插入。假設keytype為整型,構造二叉排序樹的演算法如下:
void createbst(bstree *bt)
//從鍵盤輸入元素值,建立相應二叉排序樹
} 在二叉排序樹中刪除乙個結點,不能將該結點為根的子樹全部刪除,只能刪除該結點並使得二叉樹依然滿足二叉排序樹的性質。
設刪除的結點為p,結點p的雙親為f,並假設p是f的左孩子(右孩子)可分三種情況:
(1)p為葉結點,則可直接將其刪除:
f->lchild=null;free(p);
(2)p結點只有左子樹或右子樹,則p的左子樹或右子樹直接改為其雙親結點f的左子樹
f->lchild=p->lchild或f->lchild=p->rchild;
free(p);
(3)p既有左子樹也有右子樹
1>首先找到p結點在二叉排序樹中序遍歷序列中的直接前驅s結點(無右子樹),然後將p的左子樹改為f的左子樹,而將p的右子樹改為s的右子樹。
2>首先找到p結點在二叉排序樹中序遍歷序列中的直接前驅s結點,q為s結點的雙親。利用s結點的值代替p結點的值,原s結點的左子樹改為s結點
的雙親q的右子樹,再將s結點刪除。
三種方法綜合演算法如下:
bstree delbst(bstree bt,keytype k)
if(p==null) return bt;
if(p->lchild&&p->rchild) //左右子樹不為空
p->key=s->key;
if(q!=p) q->rchild=s->lchlid;
else q->lchild=s->lchild;
free(s);
else
else
if(!f) bt=p;
else
if(q==f->lchild) f->lchild=p;
else f->rchild=p;
free(q);
}return bt;
}
資料結構與演算法(查詢)
1 查詢表 用於查詢的資料集合,由同一型別的資料元素組成,經常進行的操作 2 靜態查詢表 無需動態修改查詢表的操作,都是靜態查詢表。適合的查詢方法有順序查詢 折半查詢 雜湊查詢。3 動態查詢表 需要動態插入或刪除的操作。適合的查詢方法有二叉排序樹查詢 雜湊查詢。4 關鍵字 資料元素中唯一表示該元素的...
資料結構與演算法 查詢演算法
1.線性查詢,從頭到尾去遍歷,找到符合的則返回 2.二分法查詢 前提 目標陣列有序 package math public class dichotomy int k new dichotomy show arr,8 system.out.println k public int show int ...
資料結構與演算法 查詢演算法
第二章 查詢和排序演算法 課時1 列表查詢 1 列表查詢的含義 從物件中查詢某乙個特定的元素 2 列表查詢的方式包含兩種 順序查詢和二分查詢 3 順序查詢演算法 從開始一直搜尋到最後乙個元素進行查詢,for迴圈,時間複雜度為o n 4 二分查詢針對有效的列表直接進行首尾二分查詢,不斷使得候選區減半,...