博客作业05--查找

本文详细介绍了二叉查找树的基本概念及其特点,并深入探讨了红黑树的特性与应用,包括节点插入的具体步骤及红黑树在实际项目中的实践案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1查找的思维导图

 

1.2 查找学习体会

在本章节中,查找的内容很多,同时计算平均查找度的方法也不同,时间复杂度也不同,由于内容比较多,故各种概念容易混淆,需要多花时间研究.

我们学习了线性表,数表,和哈希表的查找。并且学会了在相同数据结构下减少时间复杂度的方法和思想。

对应二叉搜索树的特点:

1.若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

2.若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

3.任意节点的左、右子树也分别为二叉查找树。

4.中序遍历得到递增序列.

 

2.PTA实验作业(4分)

 

2.1 题目1:是否二叉搜索树

2.2 设计思路(伪代码或流程图)

bool IsBST(BinTree T)

{
若树空则为二叉搜索树;
若左子树不为空且左子树最大值大于最大值
返回不是
若右子树不为空且右子树最小值小于最大值if (T->Right!=NULL && minValue(T->Right) <= T->Data)
返回不是
返回左子树和右子树
}

2.3 代码截图

 

2.4 PTA提交列表说明。

编译错误是因为PTA的编程环境和我用的DEV不一样,有些地方不能通用

部分正确是因为左右都是,但答案是NO这个情况我没有考虑

2.1 题目2:二叉搜索树中的最近公共祖先

2.2 设计思路(伪代码或流程图)

int find(Tree T,int u)
{

如果是空树返回0 

如果查找不到u,v返0 

如果u,v有一个是根节点返回根节点的关键字

如果u,v一个在左子树,一个在右子树返回根节点的关键字 

如果都在右子树继续调用,节点变成右节点 

如果都在左子树继续调用,节点变成左节点

2.3 代码截图

 

2.4 PTA提交列表说明。

这道较为简单,在 dev 上运行后即可

2.1 题目3:qq 账户的申请与登录

2.2 设计思路(伪代码或流程图)

struct UserNode{
int ID;
char password[20];
ptrUser next;
};
ptrUser HashTable[MAXN];
//定义用户结构体指针,包括密码和 id


void InsertUserNode(int idx,int id,char* pwd)

//插入用户 id 子函数

void NewUser(int id,char pwd[])

//新建用户子函数

void Login(int id,char pwd[])

//登录用户子函数

2.3 代码截图

2.4 PTA提交列表说明。

map的不熟悉以及不会使用

3.截图本周题目集的PTA最后排名(3分)

 

第90名

共108分

3.1 PTA排名(截图带自己名字的排名)

2分

4. 阅读代码

  R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。
例如,Java集合中的TreeSetTreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

红黑树的时间复杂度为: O(lgn)

 

将一个节点插入到红黑树中,需要执行哪些步骤

第一步: 将红黑树当作一颗二叉查找树,将节点插入。
       红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。此外,无论是左旋还是右旋,若旋转之前这棵树是二叉查找树,旋转之后它一定还是二叉查找树。这也就意味着,任何的旋转和重新着色操作,都不会改变它仍然是一颗二叉查找树的事实。
       好吧?那接下来,我们就来想方设法的旋转以及重新着色,使这颗树重新成为红黑树!

第二步:将插入的节点着色为"红色"。
       为什么着色成红色,而不是黑色呢?为什么呢?在回答之前,我们需要重新温习一下红黑树的特性:
(1) 每个节点或者是黑色,或者是红色。
(2) 根节点是黑色。
(3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
(4) 如果一个节点是红色的,则它的子节点必须是黑色的。
(5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
       将插入的节点着色为红色,不会违背"特性(5)"!少违背一条特性,就意味着我们需要处理的情况越少。接下来,就要努力的让这棵树满足其它性质即可;满足了的话,它就又是一颗红黑树了。o(∩∩)o...哈哈

第三步: 通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。

转载于:https://www.cnblogs.com/xiaori520/p/9096677.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值