博客作业05--查找
1.学习总结
1.1查找的思维导图
1.2 查找学习体会
查找算法在日常生活中也是会经常使用到的,静态查找包含顺序查找、折半查找,动态查找则有树表查找,哈希表查找,但不管是那种方法,我们追求的是查找的效率,能够在尽可能短的时间内查找到数据。
2.PTA实验作业
2.1.1 题目1:是否二叉搜索树
2.1.2 设计思路
bool IsBST ( BinTree T )
{
定义静态int min=-32768;
if T=空 return true;//是二叉搜索树
if T不空
{
IsBST(T->Left);
if T->Data小于min return false;//不满足二叉搜索树的条件
重新赋值min当前节点的数据
IsBST(T->Right);
}
}
2.1.3 代码截图
2.1.4 PTA提交列表说明
还有部分因截图太长省去
- 1.一开始没有使用递归来做,第一个测试点错误
代码:
结果:
- 2.改用递归之后变成2和3测试点错误
代码:
结果:
经同学提醒后发现是符号错了,应该是小于号
2.2.1 题目2:二叉搜索树中的最近公共祖先
2.2.2 设计思路
int Find(Tree T,int n)
{
if T为空 return 0;//树中找不到n
if T->Key等于n return 1;
else if(T->Key>n)
return Find(T->Left,n);
else
return Find(T->Right,n);
}
int LCA( Tree T, int u, int v )
{
if T为空 return ERROR;
if(Find(T,u)或Find(T,v)为空) //u或v有一个不在树中则不存在公共祖先
return ERROR;
while(T)
{
if u,v都小于T->Key
T指向左子树
else if u,v都大于T->Key
T指向右子树
else break;
}
return T->Key;
}
2.2.3 代码截图
2.2.4 PTA提交列表说明
- 缺少判断u,v是否存在在树中的语句
代码:
结果:
- 在原有代码的基础上做了修改,并添加了一个判断函数
2.3.1 题目3:航空公司VIP客户查询
2.3.2 设计思路
/*插入*/
void Insert(HashTable *H,char key[],int l)
{
Node *p=Find(H,key);//判断key是否已存在
if p为空//即没找到
{
创建新空间New,将New插入合适位置;
复制信息进New中;
}
else p->distance加上此时的路程长度l;
}
2.3.3 代码截图
main函数
创建哈希表
哈希表的查找与插入
2.3.4 PTA提交列表说明
-
一开始使用map来做,但是大数据通过不了
-
老师说应该用哈希表来做,于是参考了陈越版教材来写【不过还是有一些地方不太懂的。。。
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的总分:145
4. 阅读代码
红黑树是一种具有红色和黑色链接的平衡查找树,同时满足:
-
- 每个结点或者为黑色或者为红色。
-
- 根结点为黑色。
-
- 每个叶结点(实际上就是NULL指针)都是黑色的。
-
- 如果一个结点是红色的,那么它的两个子节点都是黑色的(也就是说,不能有两个相邻的红色结点)。
-
- 对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点数量必须相同。
接下来是红黑树的代码实现
/*红黑树的结构定义*/
typedef int KeyType; //假定关键字类型为整数
typedef enum {RED = 1,BLACK = 0} Color; //定义颜色类型
typedef struct node //结点类型
{
KeyType key; //关键字项
Color color; //颜色
struct node *lchild, *rchild, *parent; //左右孩子和双亲
} *pRBTNode, RBTNode;
typedef struct Tree //红黑树类型
{
pRBTNode Root; //根结点
pRBTNode Nil; //哨兵
}*RBTree,RBTreeNode;
pRBTNode SearchNodeByKey(RBTree T, KeyType key) //根据关键字查找结点
{
pRBTNode x = T->Root;
while (x != T->Nil && key != x->key)
{
if (key < x->key)
x = x->lchild;
else
x = x->rchild;
}
return x;
}