二叉树查找增删改查

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


#ifndef __Tree_H
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree ;


struct TreeNode
{
    int num ;
};
SearchTree MakeEmpty(SearchTree T) ; //使一棵树变成空树,实现原理,如果不等于NULL,就一级一级的free掉


Position Find(int X, SearchTree T) ; //元素查找函数,实现原理,如果比左子树小,就继续递归查找左子树,如果比右字数大,则
//一直递归右子树,如果此两则条件都不满足的话,就直接返回这个元素了,这样就返回了


Position FindMin(SearchTree T) ; //找到树中最小的值,沿着左子树一直递归,知道next指针为NULL为止


Position FindMax(SearchTree T) ; //找到树中最大的值,沿着右子树一直递归,知道next指针为NULL为止 


SearchTree Insert(int X,SearchTree T) ;// 找到一个节点,自身比这个节点的左节点大,比自己的右节点小,如果
//自己比此节点小,则放在左子树的下面,如果自己比此节点大,则放在右边


SearchTree Delete(int X,SearchTree T) ; //删除一个节点,分下面三种情况
//1. 这个节点是树叶,直接将上一级的指针设置为NULL即可
//2. 这个节点只有一个儿子,则绕过这个儿子即可
//3. 这个节点有两个儿子,左边找左边最大的把这个树接上,右边找最小的把这个节点接上


int Retrieve(Position P) ; //检索




SearchTree MakeEmpty(SearchTree T)  //让一棵树变成空的树
{
    if(T != NULL)
    {
        MakeEmpty(T->Left) ;
        MakeEmpty(T->Right) ;
    }
    return NULL ;
}


Position Find(int X,SearchTree T) //查找一个二叉树
{
    if(T == NULL) return NULL ;
    if(X < T->num)
        Find(X,T->Left) ;
    if(X > T->num)
        Find(X,T->Right) ;
    return T ;
}


Position FindMin(SearchTree T) //查找一个二叉树中最小的值
{
    if(T == NULL) return NULL ;
    if(T->left == NULL)
        return T ;
    return FindMin(T->Left) ;
}


Position FindMax(SearchTree T) ;//查找一个二叉树中最大的值
{
    if(T == NULL) return NULL ;
    if(T->Right == NULL)
        return T ;
    return FindMax(T->Right) ;
}


SearchTree Insert(int X,SearchTree T) //插入操作
{//1. 如果是空的链表,则插入
 //2.如果小于这个值,则插入到左子树中,如果大于这个值,则插入到右子树中
    if(T == NULL) return NULL ;
    T = malloc(sizeof(struct node)) ;
    if(T == NULL)
        FatalError('Out of space') ;
    else
    {
        T->num = X ;
        T->left = T->right = NULL ;
    }


    if(X > T->num)
        Insert(X,T->right) ;
    else if(X < T->num)
        Insert(X,T->left) ;
}


SearchTree Delete(int X,SearchTree T) //
{
    if(T == NULL)
        return NULL ;
    //第一种情况当被查找到的节点是树叶
    //第二种情况查找到的树有一个节点
    //第三种情况查找到的树有两个节点
    //如果什么都没有查到应该返回false

    if(X > T->left && X < T->right)
    {
        TmpCell = FindMin(T->Right) ;
        T->num = TmpCell->num ;
        T->right = Delete(T->num,T->Right) ;
    }
    else if(X > T->num)
    {
        Delete(X,T->right) ;
    }
    else if(X < T->num)
    {
        Delete(X,T->left) ;
    }
    return T ;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是二叉树增删改查的C语言代码示例。 首先,我们需要定义二叉树的结构体: ```c struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; ``` 接下来,我们分别实现二叉树的增、删、改、查操作: 1. 增加节点 ```c struct TreeNode* insertNode(struct TreeNode* root, int val) { if (!root) { struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } if (val < root->val) { root->left = insertNode(root->left, val); } else if (val > root->val) { root->right = insertNode(root->right, val); } return root; } ``` 2. 删除节点 ```c struct TreeNode* deleteNode(struct TreeNode* root, int key) { if (!root) { return NULL; } if (root->val == key) { if (!root->left) { struct TreeNode* tmp = root->right; free(root); return tmp; } else if (!root->right) { struct TreeNode* tmp = root->left; free(root); return tmp; } else { struct TreeNode* p = root->right; while (p->left) { p = p->left; } root->val = p->val; root->right = deleteNode(root->right, p->val); } } else if (root->val > key) { root->left = deleteNode(root->left, key); } else { root->right = deleteNode(root->right, key); } return root; } ``` 3. 修改节点 ```c struct TreeNode* modifyNode(struct TreeNode* root, int oldVal, int newVal) { root = deleteNode(root, oldVal); root = insertNode(root, newVal); return root; } ``` 4. 查找节点 ```c struct TreeNode* searchNode(struct TreeNode* root, int val) { if (!root || root->val == val) { return root; } if (root->val > val) { return searchNode(root->left, val); } else { return searchNode(root->right, val); } } ``` 以上就是二叉树增删改查的C语言代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值