二叉排序树的查找(插入、删除)
来源:互联网 发布:国家数据统计局官网 编辑:程序博客网 时间:2024/05/22 18:23
二叉排序树的查找(插入、删除)
近期逐步开始期末复习,在博客上投入的精力将大幅减少大概一月左右!
/*二叉树的二叉链表结点结构定义*/typedef struct BiTNode{ //结点结构 int data; //结点数据 struct BiTNode *lchild, *rchild;//左右孩子指针}BiTNode, *BiTree;/*递归查找二叉排序树T中是否存在key,指针f指向T的双亲,其初始调用值位NULL,若查找成功,则指针p指向该数据元素结点,并返回TRUE;否则,指针p指向查找路径上访问过的最后一个结点,并返回FALSE*/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) //若key小于当前data值,则在左子树中继续寻找 return SearchBST(T->lchild, key, T, p); else //若key大于当前data值,则在右子树中继续寻找 return SearchBST(T->rchild, key, T, p);}/*当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回TRUE,否则返回FALSE*/Status InsertBST(BiTree *T, int key){ BiTree p, s; if (!SearchBST(*T, key, NULL, &p)){ //查找不成功时,进行插入操作 s = (BiTree)malloc(sizeof(BiTNode)); s->data = key; s->lchild = NULL; s->rchild = NULL; if (!p) *T = s; //插入s为新的根结点 else if (key < p->data) p->lchild = s; //插入s为左结点 else p->rchild = s; //插入s为右结点 return TRUE; } else return FALSE; //树中已有关键字相同的结点,不需要插入}/*若二叉排序树T中存在关键字等于key的数据元素时,删除该数据元素结点,并返回TRUE;否则返回FALSE*/Status DeleteBST(BiTree *T, int 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); }}Status 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)->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;}
阅读全文