静态查找中二分查找效率最高,但是它要求关键字有序,且不能用链表作为存储结构,为了维护表的有序性,势必要学会动态查找的方法,即二叉排序树。
下面将给出二叉查找树插入及删除操作的方法。
#include <bits/stdc++.h> using namespace std; bool f; struct node { int data; node *l, *r; }; void menu() { puts(" 1.建立二叉排序树"); puts("2.中序遍历二叉排序树"); puts("3.插入元素"); puts("4.删除键值元素"); puts("-1.-1结束 "); } void add(node *&BT, int x) { if(!BT) { BT = (node *)malloc(sizeof(node)); BT->data = x; BT->l = BT->r = NULL; } else if(BT->data > x) add(BT->l, x); else if(BT->data < x) add(BT->r, x); else f = 1; } void create(node *&BT) { int x; while(1) { cin>>x; if(x == -1) return; add(BT, x); } } void visit(node *BT) { if(BT) { visit(BT->l); printf("%d ", BT->data); visit(BT->r); } } void Delete(node *&BT, int x) { node *t; if(!BT) { puts("未找到此元素"); f = 1; } else if(BT->data < x) Delete(BT->r, x); else if(BT->data > x) Delete(BT->l, x); else { if(!BT->l && !BT->r) //无左右孩子 { free(BT); BT = NULL; } else if(!BT->l && BT->r) //仅有右孩子 { free(BT); BT = BT->r; } else if(BT->l && !BT->r) //仅有左孩子 { free(BT); BT = BT->l; } else //左右都有 { t = BT->r; while(t->l) t = t->l; BT->data = t->data; Delete(BT->r, t->data); } } } int main() { int x, n; node *BT = NULL; while(1) { menu(); cin>>x; if(x == -1) break; switch(x) { case 1: puts("请输入关键字,-1结束"); create(BT); puts("建立成功"); break; case 2: puts("遍历序列为:"); visit(BT); break; case 3: puts("请输入插入关键字"); f = 0; cin>>n; add(BT, n); if(f) puts("存在重复键值!"); else puts("插入成功!"); break; case 4: puts("请输入删除键值:"); cin>>n; f = 0; Delete(BT, n); if(!f) puts("删除成功!"); break; default: puts("输入错误!"); } } return 0; }
方案:
建立树: 13 66 1 22 30 9 10 76 8 14 15 5 -1
插入元素:15 12
删除元素:30