1.二叉树的结构
typedef struct tinode{
int data;
struct tinode *lc,*rc;
}tinode,*tnode;
2.把元素插入二叉查找树(构造二叉查找树)
void insert(tnode &t,int item){
if(!t){
t = (tnode)malloc(sizeof(tinode));
t->data = item;
t->lc = t->rc = NULL;
}
else{
if(item<t->data) //要插入的元素小于当前结点,插入当前结点的左子树
insert(t->lc,item);
else if(item>t->data,item)
insert(t->rc,item);
}
}
3.删除元素
tnode del(tnode &t,int item){
tnode temp;
if(!t) printf("要删除的元素未找到");
else{
if(item<t->data)
del(t->lc,item);
else if(item>t->data)
del(t->rc,item);
else if(t->lc&&t->rc){ //要删除的结点有左右子树
temp = findmin(t->rc); //要删除的结点的右子树里最小的元素
t->data = temp->data;
t->rc = del(t->rc,t->data);
}
else{
temp = t;
if(!t->lc)
t = t->rc;
else if(!t->rc)
t = t->lc;
free(temp);
}
}
return t;
}
4.findmin()函数
tnode findmin(tnode &t){
tnode temp = t;
while(temp->lc) temp = temp->lc; //左子树总是比右子树小
printf("右子树最小值为%d\n",temp->data);
return temp;
}
5.完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct tinode{
int data;
struct tinode *lc,*rc;
}tinode,*tnode;
void insert(tnode &t,int item){
if(!t){
t = (tnode)malloc(sizeof(tinode));
t->data = item;
t->lc = t->rc = NULL;
}
else{
if(item<t->data) //要插入的元素小于当前结点,插入当前结点的左子树
insert(t->lc,item);
else if(item>t->data,item)
insert(t->rc,item);
}
}
tnode findmin(tnode &t){
tnode temp = t;
while(temp->lc) temp = temp->lc;
printf("右子树最小值为%d\n\n",temp->data);
return temp;
}
tnode del(tnode &t,int item){
tnode temp;
if(!t) printf("要删除的元素未找到");
else{
if(item<t->data)
del(t->lc,item);
else if(item>t->data)
del(t->rc,item);
else if(t->lc&&t->rc){
temp = findmin(t->rc);
t->data = temp->data;
t->rc = del(t->rc,t->data);
}
else{
temp = t;
if(!t->lc)
t = t->rc;
else if(!t->rc)
t = t->lc;
free(temp);
}
}
return t;
}
void pre_traver(tnode &t){
if(t){
printf("%d ",t->data);
pre_traver(t->lc);
pre_traver(t->rc);
}
}
int main()
{
tnode t = NULL;
insert(t,30);
insert(t,15);
insert(t,41);
insert(t,33);
insert(t,50);
insert(t,35);
insert(t,34);
printf("删除前,前序遍历为:");
pre_traver(t);
printf("\n\n");
del(t,30); //删除30
printf("删除后,前序遍历为:");
pre_traver(t);
}
6.运行结果
删除30