#pragma once
typedef struct _NODE{
int index;
char* name;
struct _NODE* left;
struct _NODE* right;
}NODE;
#include "BTree.h"
#include <stdlib.h>
#include <string.h>
#define nodes (* node)
int _ins(NODE* root, NODE** node){
if (nodes->index < root->index)
{
if (root->left == NULL)
{
root->left = nodes;
return 1;
}
else
{
_ins(root->left, node);
return 1;
}
}
else
{
if (root->right == NULL)
{
root->right = nodes;
return 1;
}
else
{
_ins(root->right, node);
return 1;
}
}
return 0;
}
#undef nodes
int _insert(NODE** root, int index, const char* name){
NODE* node = (NODE*)malloc(sizeof(NODE));
memset(node, 0x00, sizeof(NODE));
node->name = (char*)malloc(8);
memset(node->name, 0x00, sizeof(node->name));
strcpy(node->name, name);
node->index = index;
node->left = NULL;
node->right = NULL;
if (*root==NULL)
{
*root = node;
return 1;
}
return _ins(*root, &node)>0 ? 1 : 0;
}
int _modify(NODE* root, int index, const char* newName){
if (index==root->index)
{
strcpy(root->name,newName);
return 1;
}
else
{
if (index < root->index)
{
if (root->left!=NULL)
{
_modify(root->left,index, newName);
}
return 0;
}
else
{
if (root->right != NULL)
{
_modify(root->right, index, newName);
}
return 0;
}
}
return 0;
}
void _find(NODE* root ,const char* name,NODE** p){
if (root->left != NULL && (0 == strcmp(name, root->left->name)) || root->right != NULL && (0 == strcmp(name, root->right->name)))
{
*p = root;
return;
}
if (0 == strcmp(name, root->name))
{
*p = root;
return;
}
else
{
if (root->right != NULL)
{
_find(root->right,name,p);
}
if (root->left != NULL)
{
_find(root->left,name,p);
}
return;
}
return;
}
void _finds(NODE* root , NODE** pp){
if (root->right->right == NULL)
{
*pp = root;
return;
}
else
{
_finds(root->right, pp);
}
}
int _remove(NODE** root, const char* name){
NODE* p = NULL;
_find(*root,name,&p);
NODE* pp = NULL;
if (p==NULL)
{
return 0;
}
if (0==strcmp(name,p->left->name))
{
if (p->left->left==NULL && p->left->right==NULL)
{
free(p->left);
p->left = NULL;
return 1;
}
if (p->left->left->right == NULL)
{
pp = p->left;
p->left->left->right = p->left->right;
p->left = p->left->left;
free(pp);
return 1;
}
if (p->left->left!=NULL)
{
_finds(p->left->left, &pp);
pp->right->right = p->left->right;
pp->right->left = p->left->left;
free(p->left);
p->left = pp->right;
pp->right = NULL;
return 1;
}
}
else if (0 == strcmp(name, p->right->name))
{
if (p->right->left==NULL && p->right->right==NULL)
{
free(p->right);
p->right = NULL;
return 1;
}
if (p->right->left ->right == NULL)
{
pp = p->right;
p->right->left->right = p->right->right;
p->right = p->right->left;
free(pp);
return 1;
}
if (p->right->left != NULL)
{
_finds(p->right->left, &pp);
pp->right->right = p->right->right;
pp->right->left = p->right->left;
free(p->right);
p->right = pp->right;
pp->right = NULL;
return 1;
}
}
else
{
_finds( p->left , &pp);
pp->right->right = p->right;
pp->right->left = p->left;
free(*root);
*root = pp->right;
pp->right = NULL;
return 1;
}
return 0;
}
void _show(NODE* root ){
printf("%d %s ",root->index,root->name);
if (root->right != NULL)
{
_show(root->right);
}
if (root->left!=NULL)
{
_show(root->left);
}
return;
}