学习数据结构树的笔记
#include <stdio.h>
#include <malloc.h>
typedef struct SHU{
int num;
struct SHU *left;
struct SHU *right;
} ss;
ss * Inselt(ss *head,int num) //数的插入数据函数
{
if(head==0){//空指针,先申请一波内存
head=(ss *)malloc(sizeof(struct SHU));
head->num=num;
head->left=0;
head->right=0;
}else{
if(head->num<num){//如果当前的数据比当前的数据大那就往右边进行插入
head->right=Inselt(head->right,num);
}else{//如果当前的数据比当前的数据小那就往右边进行插入
head->left=Inselt(head->left,num);
}
}
return head;
}
//树的遍历 0 前序 1 中序 2后序
//前序 |根节点 |左边节点|右边节点
//中序 |左边节点 |根节点 |右边节点
//后序 |左边节点|右边节点 |根节点
void look(ss *head,int mode)
{
switch(mode){
case 0:
if(head!=0){
printf(" %d ",head->num);
if(head->left!=0){
look(head->left,mode);
}
if(head->right!=0){
look(head->right,mode);
}
}
break;
case 1:
if(head!=0){
if(head->left!=0){
look(head->left,mode);
}
printf(" %d ",head->num);
if(head->right!=0){
look(head->right,mode);
}
}
break;
default:
if(head!=0){
if(head->left!=0){
look(head->left,mode);
}
if(head->right!=0){
look(head->right,mode);
}
printf(" %d ",head->num);
}
break;
}
}
//删除的策略
//就是吧当前节点的指针替换成其右数最小的值即可
ss * Finemin(ss *head,ss*head2)
{
ss *temp=head;
if(temp==0){
return 0;
}else{
while(temp->left!=0){
temp=temp->left;
}
}
return temp;
}
//删除的策略第一步:就是先找出被删除的节点
//第二步:找出删除节点的右树里面的最小值来替换它
ss * delete(ss *head,int num)
{
ss *temp=0;
ss *temp1=0;
ss *headtemp=head;
if(head!=0){
if(head->num!=num){
if(head->num<num){
head->right=delete(head->right,num);
}else{
head->left=delete(head->left,num);
}
}else{//找到删除的位置的
temp1=head->right;//取出右节点
temp=temp1; //
//删除节点我们不一样要删除该地址,只要把数据覆盖了就行了
if(temp1!=0){ //当前有右节点的话,
if(temp1->left==0){ //如果右节点没有左节点的话,将该右节点覆盖掉删除的节点上面
head->num=temp1->num;
head->right=temp1->right; //保留右节点的右树
free(temp1); //取消右节点的指针
}else{
while(temp1->left!=0){ //找最左边的节点
temp=temp1; //保存上一个节点
temp1=temp1->left; //继续往下搜索左树
}
//在这边我们就是找到最小的左树了,将该左树的值覆盖掉要删除的节点哪里
head->num=temp1->num;
//把将要删除的最小左树的右结点赋值给上一个节点的左指针哪里
temp->left=temp1->right;
free(temp1);
}
}else{ //如果没有右节点,直接将其左节点当做头指针
temp=headtemp;
headtemp=headtemp->left;
free(temp);
}
}
}
return headtemp;
}
void myfree(ss *head){
if(head!=0){
if(head->left!=0){
myfree(head->left);
}
if(head->right!=0){
myfree(head->right);
}
free(head);
}
}
void main(void)
{
ss *k=0,*temp=0;
k=Inselt(k,100);
k=Inselt(k,90);
k=Inselt(k,80);
k=Inselt(k,60);
k=Inselt(k,50);
k=Inselt(k,40);
temp=k;
look(temp,0);
printf("\n----------------------\n");
temp=k;
look(temp,1);
printf("\n----------------------\n");
temp=k;
look(temp,2);
printf("\n----------------------\n");
k=delete(k,60);
temp=k;
look(temp,0);
printf("\n----------------------\n");
myfree(k);
}