二叉查找树 c语言,二叉查找树(C语言实现)

/*

* 构造一颗二叉查找树,实现树的插入、删除等基本操作

*

*/

#include

#include

typedef struct node

{

int count; //记录某个元素出现的次数

int data; //数据

struct node * left;

struct node * right;

}Node,*PNode;

int array[100]; //按序保存遍历后的元素

int k=0; //数组array长度

//初始化一颗二叉排序树

PNode init()

{

PNode p=(PNode)malloc(sizeof(Node));

p->count=0;

p->left=p->right=NULL;

return p;

}

//插入结点

void insert(PNode root ,int data)

{

if(root!=NULL&&root->count==0){//初始化后的第一个元素的count为0

root->data=data;

root->count++;

return;

}

if(datadata&&root->left==NULL){

PNode p=(PNode)malloc(sizeof(Node));

p->data=data;

p->count=1;

p->left=p->right=NULL;

root->left=p;

return;

}

if(data>root->data&&root->right==NULL){

PNode p=(PNode)malloc(sizeof(Node));

p->data=data;

p->count=1;

p->left=p->right=NULL;

root->right=p;

return;

}

if(data>root->data)

insert(root->right,data);

else if(datadata)

insert(root->left,data);

else{

root->count++;

return;

}

}

//删除结点,删除成功返回1,失败返回0

int deleteNode(PNode* root ,int data)

{

PNode p,q;

//寻找要删除的结点

if(*root==NULL)

return 0;

if((*root)->data==data){//找到要删除的结点

//要删除的结点是叶子结点,直接删除

if((*root)->left==NULL && (*root)->right==NULL){

p=*root;

*root=NULL;

free(p);

return 1;

}

//要删除的结点有左子树或者右子树,此时直接用左子树或右子树代替删除的结点

if((*root)->left==NULL || (*root)->right==NULL){

p=*root;

*root=(*root)->left==NULL?(*root)->right:(*root)->left;

p->left=p->right=NULL;

free(p);

return 1;

}

//要删除的结点有左子树和右子树。删除的结点的左子树代替删除的结点,然后

//一直查找删除的结点的左子树的右子树,直到出现为空。把删除结点的右子树插入

if((*root)->left && (*root)->right){

p=*root;

*root=(*root)->left;

q=*root;

while(q->right)

q=q->right;

q->right=p->right;

p->left=p->right=NULL;

free(p);

return 1;

}

}else if((*root)->data>data){

deleteNode(&(*root)->left,data);

}else

deleteNode(&(*root)->right,data);

return 0;

}

//中序遍历

void search_middle(PNode root)

{

int i=0;

if(root==NULL)

return;

search_middle(root->left);

for(;icount;i++)

array[k++]=root->data;

search_middle(root->right);

}

//先序遍历

void search_prior(PNode root)

{

int i=0;

if(root==NULL)

return;

for(;icount;i++)

array[k++]=root->data;

search_prior(root->left);

search_prior(root->right);

}

//后序遍历

void search_last(PNode root)

{

int i=0;

if(root==NULL)

return;

search_prior(root->left);

search_prior(root->right);

for(;icount;i++)

array[k++]=root->data;

}

//求树的高度

int tree_height(PNode root)

{

int h1,h2;

if(root!=NULL&&root->count==0)

return 0;

if(root==NULL)

return 0;

h1=1+tree_height(root->left);

h2=1+tree_height(root->right);

return h1>h2?h1:h2;

}

void main()

{

int a[20];

int *p=a;

PNode pnode=init();

int i,n,deleteElement;

//读入要排序的数字个数和数字

printf("please input n(n<20):\n");

scanf("%d",&n);

for(i=0;i

{

printf("enter an Integer number:\n");

scanf("%d",p++);

}

//把待排序的元素插入二叉查找树中

for(i=0;i

insert(pnode,*(a+i));

}

search_middle(pnode);

printf("\n树的高度%d\n",tree_height(pnode));

//输出排序后的元素序列

for(i=0;i

printf("%-5d",array[i]);

printf("\n");

//删除结点

printf("请输入要删除的结点:\n");

scanf("%d",&deleteElement);

deleteNode(&pnode,deleteElement);

k=0;

search_middle(pnode);

printf("\n删除后:树的高度%d\n",tree_height(pnode));

//输出排序后的元素序列

for(i=0;i

printf("%-5d",array[i]);

printf("\n");

free(pnode);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值