动态查找表之二叉排序树的查找、遍历、删除

来源:互联网 发布: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

原创粉丝点击