/*
树的练习
*/
#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;
}
part04- 有序二叉树实现
最新推荐文章于 2021-11-21 20:14:51 发布