part04- 有序二叉树实现

/*
 树的练习
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
   int num;
   struct node *p_left;
   struct node *p_right;
}node;
node *p_root;  //根指针
//初始化函数
void init(node **pp_root){
   *pp_root = NULL;
}
//销毁函数
//删除顺序最好的方式:左子树-右子树-根节点
void destroy(node **pp_root){
  
    //实现方法1
    if(!*pp_root){//本身就是空
      return ;
   }
   if((*pp_root)->p_left){
      destroy(&((*pp_root)->p_left));
   }
   if((*pp_root)->p_right){
      destroy(&((*pp_root)->p_right));
   }
   free(*pp_root);
   *pp_root = NULL;
  /*
  if(*pp_root){
     destroy(&((*pp_root)->p_left));
     destroy(&((*pp_root)->p_right));
     free(*pp_root);
     *pp_root = NULL;
  }*/
}
//有序显示
void show(node *p_r){
   if(!p_r){
      return;
   }
   if(p_r->p_left){
     show(p_r->p_left);
   }
   printf("%d ",p_r->num);
   if(p_r->p_right){
     show(p_r->p_right);
   }
  /*
  if(p_r){
      show(p_r->p_left);
      printf("%d ",p_r->num);
      show(p_r->p_right);
  }*/
}
//查找合适的插入位置(前序遍历)
node **find(node **pp_r,int num){
   if(!(*pp_r)||(*pp_r)->num == num/*如果要插入的数字和根节点数字一致的话*/){
      return pp_r;
   }
   else{
     if(num>(*pp_r)->num){
       return find(&((*pp_r)->p_right),num);
     }
     else{
       return find(&((*pp_r)->p_left),num);
     }
   }
}
//插入数据
void insert(node **pp_r,int num){
   node **pp_tmp = find(pp_r,num);
   if(!(*pp_tmp)){
      *pp_tmp = (node *)malloc(sizeof(node));
     (*pp_tmp)->num = num;
     (*pp_tmp)->p_left = NULL;
     (*pp_tmp)->p_right = NULL;
   }
}
//删除某个节点
void remove_node(node **pp_root,int num)
{ 
   node **pp_tmp=find(pp_root,num); 
   if(*pp_tmp){
      node *p_tmp = *pp_tmp;
      //
      if(!(p_tmp->p_left)){
         *pp_tmp=p_tmp->p_right;
      }
      else if(!(p_tmp->p_right)){
         *pp_tmp=p_tmp->p_left;
      }
      else{
         node **pp_tmp1=find(&(p_tmp->p_right),p_tmp->p_left->num);
         *pp_tmp1=p_tmp->p_left;
         *pp_tmp=p_tmp->p_right;
      }
      free(p_tmp);
      p_tmp = NULL;
   }
}
int main()
{
   init(&p_root);
   insert(&p_root,50);
   insert(&p_root,30);
   insert(&p_root,20);
   insert(&p_root,70);
   insert(&p_root,80);
   insert(&p_root,60);
   insert(&p_root,90);
   insert(&p_root,100);
   remove_node(&p_root,70);
   show(p_root);
   printf("\n");
   destroy(&p_root);
   return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值