【无标题】

今天茶花会,感觉前辈们对自己的未来发展的方向感都比较明确,对这个专业都有较强烈的认知。我感觉自己对代码的兴趣并不是很强烈的,更想学3dmax,以及pr,ae之类的技能,对视频剪辑更感兴趣。但目前还是得加强自己的专业知识,以及学习能力。

二叉搜索树(BST):

1.BST首先是一颗二叉树

2.左子树的所有节点都小于根节点

3.右子树的所有节点都大于根节点

4.每个节点左右子树也是BST

这是一个简单的BST:

//查找
node * search(node * root, int data)
{
    //当根节点为空或者就是我们要找的节点就直接返回
    if(root == NULL || root->data == data)
     return root ;    
    
    //要查找的值小于根节点
    if(root->data > data)
    return search(root->left , data);
    
    //否则就大于根节点,向右查找
    return search(root->right , data);
}

注意:在删除节点中删除有左右节点的节点

//删除
node * deleteNode(node *root , int data)
{
    //树为空或者没有找到删除的节点
    if(root == NULL)
    return NULL;
    
    else   //查找要删除的节点
    if(data < root->data)
        root->left=deleteNode(root->left , data);
    else
    if(data > root->data)
        root->right=deleteNode(root->right , data);
    
    else   //找到了
    {  
        //只有一个子节点,或无子节点都可以共用代码
        if(root->left == NULL)
        {
            struct node *temp = root->right;
            free(root);
            return temp;
        }
        else
        if(root->right == NULL)
        {
            struct node *temp = root->left;
            free(root);
            return temp;
        }
        //有两个子节点:先找到中序遍历的右子树最小值
        struct node *temp =zhongxu_min(root->right);
        
        //将那个最小值放到当前节点
        root->data = temp->data;
        
        //删除那个后序的节点
        root->right = deleteNode(root->right , temp->data);
        
    }    
    
    return root;
    
}

 将搜索二叉树应用到项目:

// 定义超市物品结构体
struct Item 
{
    int id;          // 物品编号
    char name[50];   // 物品名称
    int shelf;       // 物品所在货架号
    int quantity;    // 物品数量
    float price;     // 物品单价
    char date[20];   // 物品进货时间
};


// 定义二叉搜索树结点
struct TreeNode 
{
    struct Item* item;
    
    struct TreeNode* left;   //左子树
    struct TreeNode* right;  //右子树
};

// 插入结点
struct TreeNode* insert(struct TreeNode* root, struct Item* item)
{
    if (!root) 
    {
        struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
        
        node->item = item;
        node->left = NULL;
        node->right = NULL;
        
        return node;
    }

    if (item->id < root->item->id) 
    {
        root->left = insert(root->left, item);
    } 
    else 
    {
        root->right = insert(root->right, item);
    }

    return root;
    
}

struct TreeNode* deleteNode(struct TreeNode* root, int id) 
{
    if (!root) 
    {
        printf("Item not found.\n");
        return NULL;
    }

    if (id < root->item->id) 
    {
        root->left = deleteNode(root->left, id);
    } 
    else 
    if (id > root->item->id) 
    {
        root->right = deleteNode(root->right, id);
    } else {
        // 找到要删除的结点

        // 情况1:该结点没有子结点
        if (!root->left && !root->right) 
        {
            free(root);
            
            return NULL;
        }
        // 情况2:该结点只有左子结点或右子结点
        if (!root->left) 
        {
            struct TreeNode* temp = root->right;
            free(root);
            return temp;
        } 
        else 
        if (!root->right) 
        {
            struct TreeNode* temp = root->left;
            
            free(root);
            
            return temp;
        }
        
        // 情况3:该结点既有左子结点又有右子结点
        struct TreeNode* temp = root->right;
        
        //理解为找到右节点的最左子节点
        while (temp->left) 
        {
            temp = temp->left;
        }
        root->item = temp->item;
        root->right = deleteNode(root->right, temp->item->id);
    }

    return root;
}

对界面进行了一个简单的实现:

 例如输入1 之后就清贫然后输入编号查寻

 现在还在对子函数进行完善实现,。,。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值