数据结构之查找(五)——二叉查找树
2017-12-22 11:33
429 查看
二叉查找树(Binary Search Tree)
二叉查找树(Binary Search Tree),又称为二叉排序树。它或者是一颗空树,或者是具有下列性质的二叉树:1.若它的左子树不空,则左子树所有结点的值均小于它的根结点的值;
2.若它的右子树不空,则右子树所有结点的值均大于它的根结点的值;
3.它的左右子树也分别为二叉查找树。
如:集合{62,88,58,47,35,51,99,37,93}的二叉查找树如图:
对二叉查找树进行中序遍历,就可以得到一个有序的序列{35,37,47,51,58,62,73,88,93,99}
二叉查找树比较平衡时, 查找的时间复杂度为O(logn);
不平衡的最坏情况时,查找的时间复杂度为O(n)。
二叉树的二叉链表结点结构定义
//结点结构 typedef struct BiTNode { //结点数据 int data=1; //左右孩子指针 struct BiTNode *lchild, *rchild; }BiTNode, *BiTree;
二叉查找树查找操作
//递归查找二叉查找树T中是否存在key //指针f指向T的双亲,其初始调用值为NULL //若查找成功,则指针p指向该数据元素结点,并返回TRUE //否则指针p指向查找路径上访问的最后一个结点并返回FALSE bool SearchBST(BiTree T, int key, BiTree f, BiTree *p) { //查找失败 if (!T) { *p = f; return false; } //查找成功 else if (key == T->data) { *p = T; return true; } else if (key < T->data) { //在左子树继续查找 return SearchBST(T->lchild, key, T, p); } else { //在右子树继续查找 return SearchBST(T->rchild, key, T, p); } }
二叉查找树插入操作
//当二叉查找树T不存在关键字等于key的数据元素时 //插入key并返回true,否则返回false bool InsertBST(BiTree *T, int key) { BiTree p, s; if (!SearchBST(*T, key, NULL, &p)) { s = (BiTree)malloc(sizeof(BiTNode)); s->data = key; s->lchild = s->rchild = NULL; if (!p) //插入s为新的根结点 *T = s; else if (key < p->data) //插入s为左孩子 p->lchild = s; else //插入s为右孩子 p->rchild = s; return true; } else { return false; } }
二叉查找树删除操作
删除结点有三种情况:1.叶子结点;
2.仅有左或右子树的结点;
3.左右子树都有的结点。
//从二叉查找树中删除结点p,并重接它的左或右子树 bool Delete(BiTree *p) { BiTree q, s; //右子树空则只需重接它的左子树 if ((*p)->rchild == NULL) { q = *p; *p = (*p)->lchild; free(q); } //左子树空则只需重接它的右子树 else if ((*p)->lchild == NULL) { q = *p; *p = (*p)->rchild; free(q); } //左右子树均不空 else { q = *p; s = (*p)->rchild; //转左,然后向右到尽头(找到待删结点的前驱) while (s->rchild) { q = s; s = s->rchild; } //s指向被删结点的直接前驱 (*p)->data = s->data; if (q != *p) { q->rchild = s->lchild; } else { q->lchild = s->lchild; } free(s); } return true; } //若二叉查找树T中存在关键字等于key数据元素时,则删除该数据元素结点 //并返回True,否则返回False bool DeleteBST(BiTree *T, int key) { //不存在关键字等于key的数据元素 if (!*T) { return false; } else { if (key == (*T)->data) return Delete(T); else if (key < (*T)->data) return DeleteBST(&(*T)->lchild, key); else return DeleteBST(&(*T)->rchild, key); } }
二叉查找树中序遍历
//二叉树的中序遍历递归算法 void InOrderTraverse(BiTree T) { if (T == NULL) { return; } InOrderTraverse(T->lchild); cout << T->data<<" "; InOrderTraverse(T->rchild); }
客户端
int main() { int a[10] = { 62,88,58,47,35,73,51,99,37,93 }; BiTree T = NULL; for (int i = 0; i < 10; i++) { InsertBST(&T, a[i]); } InOrderTraverse(T); cout << endl; InsertBST(&T, 44); InOrderTraverse(T); cout << endl; DeleteBST(&T,93); InOrderTraverse(T); cout << endl; return 0; }
运行结果
相关文章推荐
- 数据结构查找(1)--二叉查找树
- 数据结构(22)--动态查找之二叉排序树(二叉查找树)
- 浅析数据结构与算法8--平衡查找树之2-3查找树
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
- {数据结构}顺序查找
- 3373 数据结构实验之查找一:二叉排序树
- 数据结构之单链表(尾插法)查找、插入和删除
- 数据结构与算法-折半查找(二分查找)
- sdutacm-数据结构实验之查找二:平衡二叉树
- 数据结构——二叉查找树(C语言)
- 浅谈算法和数据结构(8):平衡查找树之2-3树
- 数据结构实验之查找一:二叉排序树 (sdut oj 3373)
- 数据结构实验之查找七:线性之哈希表
- SDUTACM 数据结构实验之查找一:二叉排序树
- 数据结构之排序和查找
- 数据结构之二叉查找树的C++实现
- C语言 数据结构之排序与查找 数据结构实验之查找四:二分查找
- 转: 数据结构——查找
- 数据结构8-顺序查找的实例
- 数据结构(一)STL二分法查找实现及上下界