王道c语言-二叉排序树删除实战

本文详细介绍了如何使用C语言实现二叉查找树的非递归创建、插入、中序遍历以及删除操作,包括BST_Insert、Creat_BST、InOrder和DeleteNode函数。还展示了在主函数中的实际应用,如查找特定元素和删除节点。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdlib.h>

//二叉排序树删除实战--考研没考过大题,因此王道数据结构书中没有代码

typedef int KeyType;
typedef struct BSTNode {  //binary sserch tree
    KeyType key;
    struct BSTNode *lchild, *rchild;
} BSTNode, *BiTree;

//非递归创建二叉查找树
//不允许相同元素插入树中,考研也不考放相等元素
int BST_Insert(BiTree &T, KeyType k) {
    BiTree TreeNew = (BiTree) calloc(1, sizeof(BSTNode));
    TreeNew->key = k;
    if (!T) {//如果是root
        T = TreeNew;
        return 1;
    }
    BiTree p = T,parent;  //用来遍历树来查找
    while (p) {
        parent = p;
        if (k > p->key) {
            p=p->rchild;
        }else if(k< p->key){
            p=p->lchild;
        } else{
            return 0; //相等元素不可以放入查找树,考研不考这个
        }
    }
    //接下来判断放到parent的左边还是右边
    if(k>parent->key){
        parent->rchild=TreeNew;
    }else{
        parent->lchild=TreeNew;
    }
    return 1;


}

void Creat_BST(BiTree &T, KeyType *str, int len) {
    for (int i = 0; i < len; ++i) {
        BST_Insert(T, str[i]);
    }
}
//二叉查找树只会考中序遍历,因为会输出有序序列
void InOrder(BiTree T) {
    if (T) {
        InOrder(T->lchild);
        printf("%d ", T->key);
        InOrder(T->rchild);
    }
}

BiTree BST_Search(BiTree T,KeyType k ,BiTree &parent){
    parent= NULL;
    while (T&&k!=T->key){
        parent=T;
        if(k > T->key){
            T=T->rchild;
        } else if(k<T->key){
            T=T->lchild;
        }
    }
    return T;
}

//与BST_Search是一样的功能,递归写法,代码简单,理解困难
int BST_Insert1(BiTree &T,KeyType k){
    if(!T){
        T=(BiTree) calloc(1,sizeof (BSTNode));
        T->key=k;
        return 1; //1 表示插入成功
    } else if(k==T->key){
        return 0;
    } else if(k<T->key){
        return BST_Insert1(T->lchild,k);
    } else{
        return BST_Insert1(T->rchild,k);
    }
}

void DeleteNode(BiTree &root,KeyType x){
    if(!root){
        return;
    }
    if(root->key>x){
        DeleteNode(root->lchild,x);
    } else if(root->key<x){
        DeleteNode(root->rchild,x);
    } else{ //找到了要删除的结点,即 root->key == x
        if(root->lchild==NULL){
            BiTree temNode=root;
            root=root->rchild;
            free(temNode);
        } else if(root->rchild==NULL){
            BiTree temNode=root;
            root=root->lchild;
            free(temNode);
        } else{ //要删除结点的左右结点都不为空
            //策略:用左子树的最右结点 or 右子树的最左结点代替要删除的结点
            //此处为 前者
            BiTree tempNode = root->lchild; //指向
            while (tempNode->rchild){
                tempNode=tempNode->rchild;
            }
            root->key=tempNode->key;
            DeleteNode(root->lchild,tempNode->key); //删除左子树的最右结点
        }
    }
};

//二叉排序树/查找树的新建、中序遍历、查找
int main() {
    BiTree T = NULL; //树根
    KeyType str[7] = {54, 20, 66, 40, 28, 79, 58};
    Creat_BST(T, str, 7);
    InOrder(T);
    printf("\n");
    BiTree serch,parent;      //返回查找到的结点,及父节点
    serch = BST_Search(T,41,parent);
    if(serch){
        printf("find key: %d\n",serch->key);
    } else{
        printf("not find");
    }
    printf("\n");
    DeleteNode(T,1);
    InOrder(T);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值