动态查找表之二叉排序树的查找、遍历、删除
来源:互联网 发布:spss19.0破解软件 编辑:程序博客网 时间:2024/04/29 23:05
一、动态查找表
静态查找表只是对表中元素进行检索,返回成功或不成功!
动态查找表的表结构是在查找的过程中动态生成的。若表中存在关键字等于给定的值key的记录,则返回成功;否则,插入关键字等于key的记录。
二、二叉排序树
二叉排序树(BST)特点结点值的大小遵循“左<中<右”的排序,其中序遍历顺序必是严格递增的。
2.1 根据给定的数组按照“左<中<右”的排序原则建立二叉排序树。
2.2 删除:设结点p为待删除结点,
a.若结点p为叶子结点,若p的双亲节点parent的左子树为p,将parent的左子树设为空。p为parent的右子树同理可得
b.若待删除结点p只有左子树,将左子树替换结点p;若p结点只有右子树同理可得
c.若p的左右子树都存在,令s为其左子树,将左子树的最大值替换p,并调整s的子结点,保证除p外,中序遍历顺序不变。
具体代码如下(考虑了内存泄漏):
binarySortTree.h
template<typename T>int getArrayLength(T &array) {return (sizeof(array) / sizeof(array[0]));}//设计数据结构,构造二叉树typedef struct node {ElemType data;struct node *lchild, *rchild;}*BST;//插入元素bool insertBST(BST &T, ElemType element) {if (T==NULL){T = new node;T->data = element;T->lchild = T->rchild = NULL;return true;}if (T->data==element) //元素的值不能和树中已有的值相等{return false;}if (element<T->data){insertBST(T->lchild,element);}else{insertBST(T->rchild,element);}}//创建二叉排序树void createBST(BST &T,ElemType array[],int len){ //Debug模式下,未初始化的栈内存上的指针全部填成0xcccccccc;T = NULL;for (int i = 0; i < len; i++){insertBST(T,array[i]);}}void visit(ElemType elem) {cout << elem << " ";}//中序遍历void preOrderTraverse(BST &T) {if (T!=NULL){preOrderTraverse(T->lchild);visit(T->data);preOrderTraverse(T->rchild);}}//释放内存void relese(BST &T) {if (T==NULL){return;}relese(T->lchild);relese(T->rchild);delete T;}//删除某个结点bool deleteNode(BST &T, ElemType element) {if (T==NULL){return false;}BST p,q,s,parent;p = T;while (p!=NULL){if (p->data == element) break;parent = p;p = (p->data < element) ? p->rchild: p->lchild;}if (p==NULL){cout << "该二叉排序树中无您要删除的值!"<<endl;return false;}if ((p->lchild==NULL)&&(p->rchild==NULL)){//重置其父亲结点的左右子孩子if (parent->lchild != NULL&&parent->lchild->data==element){parent->lchild = NULL;}if (parent->rchild!=NULL&&parent->rchild->data==element){parent->rchild = NULL;}return true;}else if (p->lchild!=NULL&&p->rchild==NULL){//要让p的左孩子接上s=p->lchild;p ->data= s->data;p->lchild = s->lchild;delete s;return true;}else if (p->lchild==NULL&&p->rchild!=NULL){//要让p的右孩子接上s = p->rchild;p->data = s->data;p->rchild = s->rchild;delete s;return true;}else{q = p;s = p->lchild;while (s->rchild!=NULL){q = s;s = s->rchild;}p->data = s->data;if (q!=p){q->rchild = s->lchild;}else{q->lchild = s->lchild;}delete s;return true;}}Search.cpp
int main(){//排序二叉树ElemType c[] = {13,23,5,8,18,37,9};len = getArrayLength(c);BST T;cout << "根据数组:";for (int i = 0; i < len; i++){visit(c[i]);}cout << endl;cout << "建立二叉排序树" << endl;createBST(T,c,len);cout << "中序遍历:";preOrderTraverse(T);cout << endl;cout << "请输入要删除的元素:";ElemType data;cin >> data;deleteNode(T, data);cout << "中序遍历:";preOrderTraverse(T);cout << endl;//释放内存relese(T);system("pause"); return 0;}
完整项目代码Github下载地址:点击打开链接,欢迎fork
阅读全文
0 0
- 动态查找表之二叉排序树的查找、遍历、删除
- 动态查找表--二叉排序树查找、删除
- 动态查找表之二叉排序树(BST)的 创建、查找、插入与删除
- 动态查找表之二叉排序树
- 动态查找表之二叉排序树
- 动态查找之二叉排序树
- 动态查找之-二叉排序树
- 二叉排序树的查找删除
- 二叉排序树-动态查找表
- 二叉排序树的插入、查找、删除、遍历(C语言版)
- 二叉排序树的相关操作(插入,查找,删除,遍历等)
- 二叉排序树查找-动态查找
- 动态查找表--二叉排序树的实现
- 二叉排序树的查找、删除、插入
- 二叉排序树的删除和查找
- 二叉排序树的插入,查找,删除
- 二叉排序树的查找-插入-删除
- 【数据结构树表的查找】二叉排序树详解和代码(生成、插入、查找、最大值、最小值、删除、中序遍历、销毁)
- js与jq基础笔记(持续添加)
- eclipse签名打包时提示Certificate is expired
- android项目架构 -----Android 知识体系与常用第三方框架
- oracle数据库定时任务dbms_job的用法详解
- 并行计算
- 动态查找表之二叉排序树的查找、遍历、删除
- 083-C++
- 【总结】explicit关键字的用法
- 判断checkbox是否选择并且弹出选择的值
- JVM调优总结(2):基本垃圾回收算法
- PCIe TPH analysis
- 矩阵奇异值分解(SVD)及其应用
- Myeclipse中 Hibernate的设置
- Swift中如何管理内存?