二叉排序树

来源:互联网 发布:c语言模块化书籍 编辑:程序博客网 时间:2024/05/22 02:17

二叉排序树(Binary Sort Tree)又称为二叉查找树,中序二叉排序树得到有序列表,它或者是一棵空树,或者是具有下列性质的二叉树:

若它的左子树不为空,则左子树所有节点的值均小于它的根结构的值。

若它的右子树不为空,则右子树所有节点的值均大于它的根结构的值。

它的左右子树也分别为二叉排序树(递归)。

二叉排序树的查找操作:

//二叉排序树结点结构定义typedef struct BiTNode{int data ;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;//递归查找二叉排序树T中是否存在key//指针f指向T的双亲,其初始值为NULL//若查找成功,则指针p指向数据元素节点,并返回true//否则指针p指向查找路径上访问的最后一个节点Status 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,否则返回FALSEStatus InsertBST (BiTree *T, int key) {BiTree p, s;if(!SearchBST(T, key, NULL, &p)){s = (BiTree)malloc(sizeof(BiTree));s->key = key;s->lchild = s->rchild = NULL;if(!p)*T = s;       //插入s为新的根节点else if (p->data > key){p->rchild = s;  //插入s为右孩子}else p->lchild = s;  //插入s为左孩子return true;}else {return false;//树中有相同节点不在插入}}//二叉排序树的删除Status Delete(BiTree *p){BiTree s, q;   //q待删除的上一个节点,双亲节点,s每一次迭代用到的节点if(NULL == p->rchild) //左子树为空,右子树接过去{q = *p;*p = (*p)->lchild;free(q);}else if(NULL == p->lchild) //右子树为空,左子树接过去{q = *p;*p = (*p)->rchild;free(q);}else {//左、右子树非空,将直接前驱的左子树做为直接前驱的双亲q = *p;s = (*p)->lchild;while(s->lchild) //循环迭代找到直接前驱(左子树最右的那一棵树){q = s;s = s->lchild;  //每次s的右子树直到为NULL}(*p)->data = q->data;//替换数据if(q != *p){q->rchild = s->lchild;}else {q->lchild = s->lchild;}free(s);}return TRUE;}


0 0
原创粉丝点击