C 二叉树

来源:互联网 发布:windows文件命名原则 编辑:程序博客网 时间:2024/06/13 03:19
#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 nodesint _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;}