1.学习总结(2分)
1.1查找的思维导图
1.2 查找学习体会
查找是C语言的重要内容,以前我就学过顺序查找和二分查找,现在学习的查找主要通过,哈希表,二叉搜索树,二叉平衡树等数据结构来等来实现,这样的查找方法可以更高效率地进行查找,学习的内容包括平衡树的LL、RR、RL、LR四种变换,哈希冲突的处理,以及查找的时间复杂度,ASL成功与不成功的计算,B-树插入删除时的分裂等等,但是遇到的问题是在学会基本原理的时候,对于查找的运用并不是了解很多,应该练习更多的对于查找的运用,还有就是map的使用使得函数更为简洁。我发现查找的内容还有很多没有学习精深,还有很多需要学习的,现在学习的只是基本的查找内容,还要更加努力。
2.PTA实验作业(4分)
2.1 题目1:6-2 是否二叉搜索树
2.2 设计思路(伪代码或流程图)
bool IsBST ( BinTree T )
if(T节点为空)
return 1;
else
{
定义一个静态整数变量min=-999999
递归左节点
if(T的data大于min)
min=T->Data;
else
return 0
递归右节点
}
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
- 这道题我起先是想用中序遍历将所有的数据存放在数组中,再将其中的树看是否顺序来判断,但是代码量太大,后来老师说了这种方法效率大大提高,
用递归来操作,代码就几十行就完成了,受益匪浅。
2.1 题目2:6-3 二叉搜索树中的最近公共祖先(25 分)
2.2 设计思路(伪代码或流程图)
int find(Tree T,int u) 查找函数
if(T为空)
return 0
else{
采用递归法查找
找到 return 1
若小于data则递归左边
否则递归右边
}
查找最近公共祖先
int LCA( Tree T, int u, int v )
{
if(T为空)
return ERROER
if(T中没有u或v)
return ERROER
if(T的两边分别是v和u)
return T->Key
if(u大于T->KEY)
向右递归
if(u小于于T->KEY)
向左递归
}
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
- 这题我做了挺久但是还是没做出来,后来请教了舍友才明白怎么做,这道题重点是在于几个if的顺序,首先是先判断是否存在于搜索树中,
然后判断是否是其祖先,(就是判断他的uv是否在左右两边)这点是这道题的关键。
2.1 题目1:7-1 QQ帐户的申请与登陆(25 分)
2.2 设计思路(伪代码或流程图)
map<string,int>p
map<string,string>pp
定义n作为指令个数
定义x,y,z字符串存储QQ的账号密码
输入n
while(n--)
{
输入 x,y,z的值
if(x为L)
{
if(p[y]不存在)
输出ERROR: Not Exist
else
判断密码pp[y],若pp[y]为z 则失败否则登陆成功
}
else
{
if(p[y]为1)
表示账号已存在
else
{
将账号存入p[y]为1将密码z存入pp[y]
并输出New: OK
}
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
- 这道题主要是map的使用,原先没用到map想算法的时候用红黑树的话要自己建树,代码量很大,用到map后,只需要定义一下mao就行,代码并不复杂只是关于map的使用。
3.截图本周题目集的PTA最后排名(3分)
3.1 PTA排名(截图带自己名字的排名)
3.2 我的总分:145
4. 阅读代码(必做,1分)
/*
* 添加节点:将节点(node)插入到红黑树中
*
* 参数说明:
* root 红黑树的根
* node 插入的结点 //
*/
static void rbtree_insert(RBRoot *root, Node *node)
{
Node *y = NULL;
Node *x = root->node;
// 1. 将红黑树当作一颗二叉查找树,将节点添加到二叉查找树中。
while (x != NULL)
{
y = x;
if (node->key < x->key)
x = x->left;
else
x = x->right;
}
rb_parent(node) = y;
if (y != NULL)
{
if (node->key < y->key)
y->left = node; // 情况2:若“node所包含的值” < “y所包含的值”,则将node设为“y的左孩子”
else
y->right = node; // 情况3:(“node所包含的值” >= “y所包含的值”)将node设为“y的右孩子”
}
else
{
root->node = node; // 情况1:若y是空节点,则将node设为根
}
// 2. 设置节点的颜色为红色
node->color = RED;
// 3. 将它重新修正为一颗二叉查找树
rbtree_insert_fixup(root, node);
}
-
这是红黑树的建立c语言代码,rbtree_insert(root, node)的作用是将"node"节点插入到红黑树中。其中,root是根,node是被插入节点。实现插入的时候将节点的颜色改变
,并且用递归方法调整了红黑树。十分巧妙。 -
https://blog.csdn.net/xiamo20149/article/details/46690261
这里面是我看到的比较详细的红黑树C语言实现讲的简洁清晰,细节方面写的很好,很好理解分享给大家。