博客作业05--查找
1.学习总结(2分)
1.1查找的思维导图
1.2 查找学习体会
查找的学习有很多是在树上实现的,比如二叉搜索树,二叉平衡树,所以树的学习就很重要,特别是学习平衡树时,LL、RR、RL、LR四种变换的过程要记得清楚,明白它每步的变换。
还有就是计算各种ASl也是难点和重点,最后弄清楚后其实也是挺简单的。B-树插入删除时的分裂和合并也是要重点掌握的,容易弄错的知识点。哈希表的构造也是重点,冲突的解决,探究次数,以及成功ASL,不成功ASL。这章都是一些高效的查找方法,虽然有些具体代码不用我们直接写出,但是理解其中思路对我们以后的写代码的思路还是有帮助的。
2.PTA实验作业(4分)
题目1:6-2 是否二叉搜索树
设计思路(伪代码或流程图)
定义两个变量判断左子树和右子树是否为搜索树
定义一个临时树节点p
if(T不为空){
if(T存在左子树)
p存T的左子树
查找左子树的最大值是否超过T的值
if(左子树最大值大于根的值)flag1等于0;
else flag1=1;
if(T存在右子树)
p存T的右子树
查找右子树的最小值是否小过T的值
if(右子树最小值小于根的值)flag2等于0;
else flag2=1;
if(flag1*flag2==1)返回1;
else 返回0;
如果T有左子树或右子树,递归调用该函数
代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
PTA提交列表说明。
刚开始只是简单比较每个根节点于左右子树大小的关系,没有考虑到,左子树全部节点要小于根节点或右字数全部节点大于根节点,后来发现了这个错误改正后就对了。
题目2:6-3 二叉搜索树中的最近公共祖先
设计思路(伪代码或流程图)
查找u和v节点是否都存在于树中,有一个不存在则直接返回ERROR;
如果都存在则进行下面步骤:
if(u==v)返回u;
else
while(1)
if(u和v在根节点两侧或者根节点等于u或v的某个值)返回根节点的值;
if(u和v在同侧)递归调用该侧的子树;
代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
PTA提交列表说明。
该题我是根据测试点一个点一个点的补充进去的,刚开始写u和v相等,后来写不等于的各种情况,最后补充完整,主要是思路,有了思路后这道题还是很简单的题目。
题目3:7-1 QQ帐户的申请与登陆
设计思路(伪代码或流程图)
建立两个map,第一个p判断user是否已存在,第二个QQ则存储信息;
输入操作的个数;
while(n--)
输入操作L或N,和账号密码
if(操作是L)
if(p)中无记录,则提示"ERROR: Not Exist"
else
if(密码不匹配)提示"ERROR: Wrong PW"
否则 提示"Login: OK"
if(操作是N)
if(p)中有记录,则提示"ERROR: Exist"
else
p中账号记录为有;
密码存到QQ的账号中
提示"New: OK"
代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
PTA提交列表说明。
这道题用到了以前没用过的map,通过百度了解了一些基本函数,自己写了一遍,结果对了一个点,但是由于以前没用过,所以不知道要怎么调试,所以请教了同学,于是换了另一种写法就对了。
3.截图本周题目集的PTA最后排名(3分)
3.1 PTA排名(截图带自己名字的排名)
3.2 我的总分:145
4. 阅读代码(必做,1分)
红黑树的节点声明,其中Parent指针是指向某一节点的父节点的指针:
typedef struct TreeNode *PtrRBTNode;
typedef struct TreeNode RBTNode;
struct TreeNode{
ElementType Key;
ColorType Color;
PtrRBTNode Left;
PtrRBTNode Right;
PtrRBTNode Parent;
};
红黑树的总体声明,该声明中包含了指向红黑树根节点的指针和指向用作sentinel的dummy node的指针:
typedef struct Tree *PtrRBT;
struct Tree{
PtrRBTNode Root;
PtrRBTNode NullNode;
};
一些其他的相关函数:
PtrRBT RBInit(PtrRBT T){
T = (PtrRBT)malloc(sizeof(struct Tree));
T->Root = NULL;
T->NullNode = (PtrRBTNode)malloc(sizeof(RBTNode));
T->NullNode->Key = -1;
T->NullNode->Color = Black;
T->NullNode->Left = T->NullNode->Right = T->NullNode->Parent = NULL;
return T;
}
PtrRBTNode RBCreateNode(PtrRBT T, ElementType Val){
PtrRBTNode NewNode = (PtrRBTNode)malloc(sizeof(RBTNode));
NewNode->Key = Val;
NewNode->Color = Red;
NewNode->Left = NewNode->Right = T->NullNode;
return NewNode;
}
PtrRBTNode RBSearch(PtrRBT T, ElementType Val){
PtrRBTNode TempNode = T->Root;
if(NULL == TempNode){
return NULL;
}
while(T->NullNode != TempNode){
if(TempNode->Key > Val){
TempNode = TempNode->Left;
}
else if(TempNode->Key < Val){
TempNode = TempNode->Right;
}
else{
return TempNode;
}
}
return NULL;
}
PtrRBTNode RBFindSuccessor(PtrRBT T, PtrRBTNode Root){
while(T->NullNode != Root->Left){
Root = Root->Left;
}
return Root;
}
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
红黑树能够以O(log2 n) 的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构 能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。