C 二叉树

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值