|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <stdio.h>
- #include <stdlib.h>
- typedef int ElemType;
- typedef struct BiTNode {//二叉链表
- ElemType data;
- BiTree lchild; //左指针
- BiTree rchild; //右指针
- } BiTNode, * BiTree;
- /*
- -二叉排序树:
- -若它的左子树不为空, 则左子树上所有结点的值均小于它的根结构的值;
- -若它的右子树不为空, 则右子树上所有结点的值大于它的根结构的值;
- -它的左、右子树也分别为二叉排序树(递归)。
- */
- //递归查找二叉排序树T中是否存在key
- //若查找成功,则指针p指向该数据元素结点,并返回1
- //否则指针p指向查找路径上访问的最后一个结点,并返回0
- //f指向T的双亲,初始值值为NULL
- int Search_BinarySortTree(BiTree T, int key, BiTree f, BiTree *p) {
- if (!T) { //查找不成功
- *p = f;
- return 0;
- }
- else if (key == T->data) { //查找成功
- *p = T;
- return 1;
- }
- else if (key < T->data) { //在左子树继续查找
- return Search_BinarySortTree(T->lchild, key, T, p);
- }
- else { //在右子树继续查找
- return Search_BinarySortTree(T->rchild, key, T, p);
- }
- }
- //当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回1否则返回0
- //如果T为NULL;要给T根节点,所以为BiTree *T
- int Insert_BinarySortTree(BiTree *T, int key) {
- BiTree p, s;
-
- if (!Search_BinarySortTree(*T, key, NULL, &p)) {
- s = (BiTree)malloc(sizeof(BiTNode)); //创建一个新的节点
- s->data = key;
- s->lchild = s->rchild = NULL;
- if (!p) { //说明没有根节点;树为空
- *T = s; //插入s为新的根结点
- }
- else if (key < p->data) { //key小于它的的值
- p->lchild = s; //s作为左子树
- }
- else{ //key大于它的的值
- p->rchild = s; //s作为右子树
- }
- return 1;
- }
- else{
- return 0; //树中已有关键字相同的结点,不再插入
- }
- }
- //删除二叉排序树T中的key
- int Delete_BinarySortTree(BiTree *T, int key) {
- BiTree p;
- if (Search_BinarySortTree(*T, key, NULL, &p)) { //找到要删除的节点
- return Delete(&p);
- }
- else {
- return 0; //树中找不到节点值为key
- }
- }
- //删除p节点;使用左子树的最大节点,或右子树的最小节点替换(p节点不为空)
- int Delete(BiTree *p){
- BiTree q; //存放要删除的节点;方便释放内存
- BiTree 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 { //2个都为空;这里使用直接前驱替换(还可以使用直接后驱)
- q = *p;
- s = (*p)->lchild; //将左子树放在要删除的节点位置上
- while (s->rchild) { //找到最右边的子树
- q = s; //直接前驱的双亲
- s = s->rchild;
- }
- //因为要保存链接,所以替换数据,删除被替换数据的节点
- (*p)->data = s->data; //使用直接前驱的值替换掉p节点的值
- if (q != p) { //s是q的右子树,
- q->rchild = s->lchild;
- }
- else{ //q就是p节点,跳过s连接s->lchild
- q->lchild = s->lchild;
- }
- free(s);
- }
- return 1;
- }
- int main() {
- return 0;
- }
复制代码
第6到10行改成这样
- typedef struct BiTNode {//二叉链表
- ElemType data;
- struct BiTNode *lchild; //左指针
- struct BiTNode *rchild; //右指针
- } BiTNode, * BiTree;
复制代码
|
|