二叉排序树的实现

包括二叉排序树的增加、遍历和删除

#include <stdio.h>
#include <stdlib.h>
typedef int myType;
/*二叉排序树*/
typedef struct structTree{
    myType node;
    struct structTree* leftNode;
    struct structTree* rightNode;
}Btree;

Btree* init();
void addChild(Btree* tree,int num);
void printTree(Btree* tree);
Btree* initHead(int headNode);
Btree* deleteOneNode(Btree* tree,myType num);

int main()
{
    int headNode=10;
    Btree* tree=initHead(headNode);
    int a[9]={8,20,-5,9,11,30,-10,25,35};
    for(int i=0;i<9;i++){
        addChild(tree,a[i]);
    }
    printTree(tree);
    deleteOneNode(tree,20);
    printf("-------------先根遍历---------------\n");
    printTree(tree);
    return 0;
}

/*初始化一个节点*/
Btree* init(){
    Btree* tree=(Btree*)malloc(sizeof(Btree));
    tree->leftNode=NULL;
    tree->rightNode=NULL;
    return tree;
}

/*初始化头节点*/
Btree* initHead(int headNode){
    Btree* tree=init();
    tree->node=headNode;
    return tree;
}

/*添加孩子节点*/
void addChild(Btree* tree,int num){
    Btree* t=tree;
    while(t!=NULL){
        if(t->node > num){
            if(t->leftNode==NULL){
                t->leftNode=init();
                t->leftNode->node=num;
                break;
            }
            t=t->leftNode;
            continue;
        }else{
            if(t->rightNode==NULL){
                t->rightNode=init();
                t->rightNode->node=num;
                break;
            }
            t=t->rightNode;
            continue;
        }
    }
}
/*先根遍历*/
void printTree(Btree* tree){
    if(tree!=NULL){
        printf("输出:%d\n",tree->node);
        printTree(tree->leftNode);
        printTree(tree->rightNode);
    }
}

/*删除一个节点*/
Btree* deleteOneNode(Btree* tree,myType num){
    if(tree==NULL){/*如果树为空,返回*/
        return tree;
    }else if(num > tree->node){/*如果num大于该节点,进入该节点右子树*/
        tree->rightNode=deleteOneNode(tree->rightNode,num);
    }else if(num < tree->node){/*如果num小于该节点,进入该节点左子树*/
        tree->leftNode=deleteOneNode(tree->leftNode,num);
    }else if(num==tree->node){/*如果相等,表示找到该节点,进行处理*/
        /*如果该节点左右子树不空,则在该节点左子树上找一个最大的值放在该节点的位置,
                并删除刚刚找到的在左子树上的最大值的那个节点*/
        if(tree->leftNode!=NULL&&tree->rightNode!=NULL){
            Btree* temp=tree->leftNode;
            /*查找左边最大值*/
            while(1){
                if(temp->rightNode!=NULL){
                    temp=temp->rightNode;
                }else{
                    break;
                }
            }
            tree->node=temp->node;
            tree->leftNode=deleteOneNode(tree->leftNode,temp->node);
        }else if(tree->rightNode==NULL&&tree->leftNode==NULL){/*如果左右子树都空,删除该节点*/
            Btree* temp2=tree;
            tree=NULL;
            free(temp2);
        }else if(tree->leftNode==NULL){/*如果该节点左子树为空,直接将右子树挂在该节点上*/
            Btree* temp2=tree;
            tree=tree->rightNode;
            free(temp2);
        }else if(tree->rightNode==NULL){/*如果该节点右子树为空,直接将左子树挂在该节点上*/
            Btree* temp2=tree;
            tree=tree->leftNode;
            free(temp2);
        }
        return tree;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值