数据结构 实验五 查找
查找这一部分的代码量较之前少一些,也较为简单,此处给出了二叉排序树上的查找、插入、删除等基本操作的算法,由于二叉排序树不考虑对整棵树的动态优化,所以比较简单易懂;平衡二叉树弥补了二叉排序树的这一不足之处,实现的方式也很巧妙。
下面是二叉排序数的相关代码:
#include <stdio.h> #include <stdlib.h> #include "Datahead.h" /*二叉树的链式存储表示*/ typedef int TElemType; /*由用户定义的实际数据类型*/ typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; /*左右孩子指针*/ } BiTNode, *BiTree; /*结点类型*/ typedef int KeyType; /*二叉排序树使用整形数据*/ typedef int ElemType; /*二叉排序树使用整形数据*/ void main() { // 函数声明 void Inorder(BiTree T); /*中序遍历二叉树*/ Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree *p); Status InsertBST(BiTree *T, ElemType e); Status DeleteBST(BiTree *T, KeyType key); Status Delete(BiTree *p); Status EQ(KeyType key1, KeyType key2); Status LT(KeyType key1, KeyType key2); BiTree T = NULL; BiTree p = NULL; printf(" ********************************************** "); printf(" 二叉树排序树查找"); printf(" ********************************************** "); /*请补充代码 */ /*所用函数,请参照课本算法*/ int select; TElemType e; while (TRUE) { printf(" (1)、插入新值 "); printf("(2)、查找 "); printf("(3)、删除 "); printf("(4)、中序遍历二叉排序树 "); printf("(0)、退出程序 "); printf(" 请选择操作序号:"); scanf("%d", &select); switch (select) { case 1: printf("请输入希望插入的元素的值: "); scanf("%d", &e); if(InsertBST(&T, e)) { printf(" 插入成功! "); } else { printf(" 插入失败! "); } break; case 2: printf("请输入希望查找的元素的值: "); scanf("%d", &e); if(SearchBST(T, e, NULL, &p)) { printf(" 您查找的元素存在 "); } else { printf(" 您查找的元素不存在! "); } break; case 3: printf("请输入希望删除的元素的值: "); scanf("%d", &e); if(DeleteBST(&T, e)) { printf(" 删除成功! "); } else { printf(" 删除失败,不存在该元素! "); } break; case 4: printf(" 当前二叉排序树中序遍历为: "); Inorder(T); break; case 0: return; default: break; } } system("pause"); } /*中序遍历二叉树的简单写法 */ void Inorder(BiTree T) { if(T) { Inorder(T->lchild); printf("%d ",T->data); Inorder(T->rchild); } } // 判断是否相等 Status EQ(KeyType key1, KeyType key2){ if (key1==key2) return TRUE; else return FALSE; } Status LT(KeyType key1, KeyType key2){ if (key1<key2) return TRUE; else return FALSE; } Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree *p) { /* 算法9.5(b) */ /* 在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素, */ /* 若查找成功,则指针p指向该数据元素结点,并返回TRUE, */ /* 否则指针p指向查找路径上访问的最后一个结点并返回FALSE, */ /* 指针f指向T的双亲,其初始调用值为NULL */ if (!T) { *p = f; return FALSE; } /* 查找不成功 */ else if (EQ(key, T->data)) { *p = T; return TRUE; } /* 查找成功 */ else if (LT(key, T->data)) return SearchBST(T->lchild, key, T, p); /* 在左子树中继续查找 */ else return SearchBST(T->rchild, key, T, p); /* 在右子树中继续查找 */ } /* SearchBST */ Status InsertBST(BiTree *T, ElemType e) { /* 算法9.6 */ /* 当二叉排序树T中不存在关键字等于e.key的数据元素时, */ /* 插入e并返回TRUE,否则返回FALSE */ BiTree p, s; if (!SearchBST(*T, e, NULL, &p)) { /* 查找不成功 */ s = (BiTree)malloc(sizeof(BiTNode)); s->data = e; s->lchild = s->rchild = NULL; if (!p) *T = s; /* 插入 s 为新的根结点 */ else if (LT(e, p->data)) p->lchild=s; /* 插入s为左孩子 */ else p->rchild = s; /* 插入 s 为右孩子 */ return TRUE; } else return FALSE; /* 树中已有关键字相同的结点,不再插入 */ } /* Insert BST */ Status DeleteBST(BiTree *T, KeyType key) { Status Delete(BiTree *p); /* 算法9.7 */ /* 若二叉排序树T中存在关键字等于key的数据元素时, */ /* 则删除该数据元素结点p,并返回TRUE;否则返回FALSE */ if (!(*T)) return FALSE; /* 不存在关键字等于key的数据元素 */ else { if (EQ(key, (*T)->data)) /* 找到关键字等于key的数据元素 */ return Delete(T); else if (LT(key, (*T)->data)) return DeleteBST(&((*T)->lchild),key); else return DeleteBST(&((*T)->rchild), key); } } /* DeleteBST */ Status Delete(BiTree *p) { /* 算法9.8 */ /* 从二叉排序树中删除结点p,并重接它的左或右子树 */ BiTree q, s; if (!((*p)->rchild)) { /* 右子树空则只需重接它的左子树 */ q = *p; *p = (*p)->lchild; free(q); } else if (!((*p)->lchild)) { /* 只需重接它的右子树 */ q = *p; *p = (*p)->rchild; free(q); } else { /* 左右子树均不空 */ q = *p; s = (*p)->lchild; while (s->rchild) /* 转左,然后向右到尽头 */ { q = s; s = s->rchild; } (*p)->data = s->data; /* s指向被删结点的"后继" */ if (q != *p) q->rchild = s->lchild; /* 重接*q的右子树 */ else q->lchild = s->lchild; /* 重接*q的左子树 */ free(s); } return TRUE; } /* Delete */
可以直接复制上述代码,也可以去我的网盘下载源代码cpp文件