10个排序数 c语言代码,C语言二叉排序(搜索)树实例

/**1.实现了递归 非递归插入(创建)二叉排序(搜索)树;

分别对应Insert_BinSNode(TBinSNode* T,int k),NonRecursion_Insert_BinSNode(TBinSNode* T,int k);

2.实现了递归 非递归查找 二叉排序(搜索)树 ;

分别对应Find_BinSNode(TBinSNode *T,int s),NonRecursion_Find_BinSNode(TBinSNode *T,int s);

3. 实现了非递归删除 二叉排序(搜索)树;

分别对应Delete_BinSNode();

4. 实现了递归先序、中序、后序遍历二叉排序(搜索)树;

分别对应Pre_Print_BinSNode(TBinSNode T),In_Print_BinSNode(TBinSNode T),Post_Print_BinSNode(TBinSNode T);

*/

#include

#include

typedef struct BinSTreeNode{

int num;

struct BinSTreeNode *lchild,*rchild;

}BinSNode,*TBinSNode;

int Empty_Tree(TBinSNode T){

if(!T){

return 1;

}else{

return 0;

}

}

/*---------------------非递归方法 二叉排序树的删除-----------------*/

void Delete_BinSNode(TBinSNode *T,int del){

TBinSNode cur,pre,lt,rblast;

cur=*T;

pre=NULL;

//如果二叉排序树为空

if(Empty_Tree(cur)){

printf("Sorry,Tree is none");

return;

}

//如果二叉排序树不为空,先找到即将删除的元素del.这里再次实现一遍查找,当然也可以修改一下Find类的函数

while(cur && cur->num!=del){

if(del>cur->num){

pre=cur;

cur=cur->rchild;

}else{

pre=cur;

cur=cur->lchild;

}

}

if(!cur){

printf("Sorry,you want to delete the node ,which is non-existent");

return;

}

if(cur->num==del){

printf("find the delete node,wait a minute.......\n");

}

//如果找到待删除的结点,立刻判断该结点有无左子树

//情况一:待删除结点无左子树

if(!cur->lchild){

if(pre==NULL){

cur=*T;

*T=(*T)->rchild;

free(cur);

return;

}

if(pre->lchild && pre->lchild->num==del){

pre->lchild=cur->rchild;

free(cur);

return;

}

if(pre->rchild && pre->rchild->num==del){

pre->rchild=cur->rchild;

free(cur);

return;

}

}

//情况二:待删除的结点有左子树。

if(cur->lchild){

lt=cur->lchild;

//情况2.1:该左子树无右子树

if(!lt->rchild){

if(pre->lchild && pre->lchild->num==del){

pre->lchild=lt;

free(cur);

return;

}

if(pre->rchild && pre->rchild->num==del){

pre->rchild=lt;

free(cur);

return;

}

}

//情况2.2:该左子树有右子树

if(lt->rchild){

while(lt->rchild){

rblast=lt; //该左子树中最大的结点的前一个结点.

lt=lt->rchild;

}

cur->num=lt->num;

rblast->rchild=lt->lchild;

free(lt);

return;

}

}

}

/*--------------------递归方法 查找 二叉排序树-------------------*/

void Find_BinSNode(TBinSNode T,int s){

if(s==T->num){

printf("%d\n",T->num);

return;

}

if(s>T->num){

Find_BinSNode(T->rchild,s);

}else{

Find_BinSNode(T->lchild,s);

}

}

/*-------------------非递归方法 查找二叉排序树--------------------*/

void NonRecursion_Find_BinSNode(TBinSNode T,int s){

if(Empty_Tree(T)){

printf("Tree is none");

return;

}

while(T && s!=T->num ){

if(s>T->num){

T=T->rchild;

}else{

T=T->lchild;

}

}

if(!T){

printf("Sorry,Not Find!");

exit(0);

}

if(s==T->num){

printf("%d\n",T->num);

}

}

/*-----------------递归方法 创建/插入 二叉排序树------------------*/

void Insert_BinSNode(TBinSNode *T,int k){

// int n;

TBinSNode node;

// scanf("%d",&n);

if(Empty_Tree(*T)){

*T=(TBinSNode)malloc(sizeof(BinSNode));

(*T)->num=k;

(*T)->lchild=(*T)->rchild=NULL;

return;

}else{

if(k>(*T)->num){

Insert_BinSNode(&(*T)->rchild,k);

}else{

Insert_BinSNode(&(*T)->lchild,k);

}

}

}

/*----------------------先序遍历二叉排序树----------------------------------*/

void Pre_Print_BinSNode(TBinSNode T){

if(T){

printf("%d ",T->num);

Pre_Print_BinSNode(T->lchild);

Pre_Print_BinSNode(T->rchild);

}

}

/*-----------------------中序遍历二叉排序树-----------------------------------*/

void In_Print_BinSNode(TBinSNode T){

if(T){

In_Print_BinSNode(T->lchild);

printf("%d ",T->num);

In_Print_BinSNode(T->rchild);

}

}

/*-----------------------后序遍历二叉排序树-----------------------------------*/

void Post_Print_BinSNode(TBinSNode T){

if(T){

Post_Print_BinSNode(T->lchild);

Post_Print_BinSNode(T->rchild);

printf("%d ",T->num);

}

}

/*---------------------非递归 创建/插入 二叉排序树---------------------------*/

void NonRecursion_Insert_BinSNode(TBinSNode *T,int k){

//如果为空的二叉排序树

TBinSNode cur,p,t;

t=*T;

if(!*T){

*T=(TBinSNode)malloc(sizeof(BinSNode));

(*T)->num=k;

(*T)->lchild=(*T)->rchild=NULL;

return;

}else{ //二叉排序树不为空。

while(t){

if(k>t->num){

cur=t;

t=t->rchild;

}else{

cur=t;

t=t->lchild;

}

}

p=(TBinSNode)malloc(sizeof(BinSNode));

p->num=k;

p->lchild=p->rchild=NULL;

if(k>cur->num){

cur->rchild=p;

}

if(knum){

cur->lchild=p;

}

}

}

int main(void){

TBinSNode T=NULL;

int k,s,del;//创建的 查找的 删除的

while(scanf("%d",&k) && k){

// Insert_BinSNode(&T,k);

NonRecursion_Insert_BinSNode(&T,k);

}

// scanf("%d",&s);

// Find_BinSNode(T,s);

// NonRecursion_Find_BinSNode(T,s);

Pre_Print_BinSNode(T);

scanf("%d",&del);

Delete_BinSNode(&T,del);

Pre_Print_BinSNode(T);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现二叉排序的完整代码: ```c #include <stdio.h> #include <stdlib.h> struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNode* createNode(int val) { struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } struct TreeNode* insert(struct TreeNode* root, int val) { if (root == NULL) { return createNode(val); } if (val < root->val) { root->left = insert(root->left, val); } else { root->right = insert(root->right, val); } return root; } void inorderTraversal(struct TreeNode* root) { if (root != NULL) { inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); } } int main() { struct TreeNode* root = NULL; root = insert(root, 5); insert(root, 3); insert(root, 7); insert(root, 1); insert(root, 9); printf("Inorder traversal of BST: "); inorderTraversal(root); return 0; } ``` 说明: - `struct TreeNode` 定义了二叉节点的结构体,包括节点的值、左子和右子。 - `createNode` 函用于创建一个节点。 - `insert` 函用于插入一个新节点到二叉排序中,并返回根节点。 - `inorderTraversal` 函用于中序遍历二叉排序。 - `main` 函中创建了一个空的根节点,插入几个节点,并输出中序遍历结果。 上述代码中,我们采用了递归的方式实现二叉排序的插入和中序遍历。需要注意的是,在插入节点时,我们需要判断新节点应该插入到左子还是右子中。在中序遍历时,我们先遍历左子,再输出当前节点的值,最后遍历右子

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值