今天茶花会,感觉前辈们对自己的未来发展的方向感都比较明确,对这个专业都有较强烈的认知。我感觉自己对代码的兴趣并不是很强烈的,更想学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 之后就清贫然后输入编号查寻
现在还在对子函数进行完善实现,。,。