算法与数据结构第六次作业 渣五战的记忆力

最近复习到树的内容,之前的作业内容涉及到图论,之后再一起复习。

这题我当时自己做的时候完全没用到树,其实我这块学得比较差,自己也没什么信心。今天优秀作业的讲评,了解一下思路,回来参考了一下学霸的代码,自己敲了一遍。之后要多练习一些树相关的题。

先说思路:

       step1.先是建树,用一个结构体来记录每个结点的左儿子和右儿子。

       step2.找到这棵树的根节点,我觉得这次优秀代码的这个部分是比较巧妙的。

参考了学霸的思路如下:            

对每个点设置3个变量,0,1-1.

对于-1,指的是永远不可能为根(当一个数为另一个的左儿子或者右儿子的时候)

对于1,指的是有可能为根,并且加到root里了。

对于0,指的是还没扫描到这个点

最终得到的root即为root点。

       step3.对这棵树进行先序遍历

      

帖代码上来说:

<span style="font-size:18px;">#include <stdio.h>
#include <iostream>
using namespace std;
#define MAX 2001
struct T
{
	int lson;
	int rson;
}tree[MAX];
int flag[MAX];
int pre[MAX]={0};
int i=0;
void xxbl(int p)
{
	if(p)
	{
	pre[i]=p;
	i++;
	xxbl(tree[p].lson);
	xxbl(tree[p].rson);
	}
}
int main()
{
	int n,m,q,root=0,x,y,j;
	memset(tree,0,sizeof(tree));
	memset(flag,0,sizeof(flag));
	scanf("%d%d%d",&n,&m,&q);
	while(n--)
	{
		scanf("%d%d",&x,&y);
		tree[x].lson=y;
		if(flag[x]==0)//对于未确定是否为根的节点进行运算
		{
			root+=x;
			flag[x]=1;
		}
		if(flag[y]==1)//对于认为可能是根节点,但又作为儿子出现的节点进行运算
		{
			root-=y;
			flag[y]=-1;
		}
		flag[y]=-1;
	}
	while(m--)
	{
		scanf("%d%d",&x,&y);
		tree[x].rson=y;
		if(flag[x]==0)
		{
			root+=x;
			flag[x]=1;
		}
		if(flag[y]==1)
		{
			root-=y;
			flag[y]=-1;
		}
		flag[y]=-1;
	}
	//printf("%d",root);//这个是中间过程用来检测root是否正确
	xxbl(root);
	while(q--)
	{
		scanf("%d",&x);
		if(tree[x].lson)
		{
			printf("<%d,1,",tree[x].lson);
		}
		else
		{
			for(j=0;pre[j]!=0;j++)
			{
				if(pre[j]==x)
					break;
			}
			if(j==0)
				printf("<%d,0,",x);
			else
			{
				printf("<%d,0,",pre[j-1]);
			}
		}
		printf("%d,",x);
		if(tree[x].rson)
		{
			printf("1,%d>",tree[x].rson);
		}
		else
		{
			for(j=0;pre[j]!=0;j++)
			{
				if(pre[j]==x)
					break;
			}
			if(pre[j+1]==0)
				printf("0,%d>",x);
			else
			{
				printf("0,%d>",pre[j+1]);
			}
		}
		printf("\n");
	}
	return 0;
}



/*
3 2 6
5 4
3 2
7 6
3 5
5 7
2 3 4 5 6 7
*/



		

</span>

树结构开始学得有点吃力,多刷题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习数据结构和算法通常需要以下几步: 1. 了解基本的编程知识,包括变量、条件语句、循环、函数等。 2. 学习基本的数据结构,如数组、链表、栈、队列、树等。 3. 学习常见的算法,如排序、搜索、图论等。 4. 多做题,熟练掌握数据结构和算法的应用。 5. 学习进阶的数据结构和算法,如哈希表、并查集、最短路等。 可以通过读书、看视频、做题等方式来学习数据结构和算法。有很多优秀的书籍和在线课程可以帮助你学习。 ### 回答2: 学习数据结构与算法需要以下几个步骤: 1. 了解基本知识:首先,要了解数据结构和算法的概念、特点以及基本分类。了解常见的数据结构,如数组、链表、栈、队列、树、图等以及它们的特点和应用场景。同时,熟悉常见的算法,如排序、查找、递归、动态规划等,并能够理解它们的原理和时间复杂度。 2. 学习实际应用:对于每种数据结构和算法,了解它们的实际应用场景和解决问题的方法。通过实际案例来学习,可以更好地理解和记忆。 3. 多实践:理论知识的学习只是第一步,要真正掌握数据结构与算法,需要进行大量的练习和实践。可以通过LeetCode、牛客网等网站进行算法题目的练习,尽量多遇到不同类型的题目,提高解题的思维灵活性和效率。 4. 阅读相关教材和书籍:有关数据结构与算法的经典书籍有很多,如《算法导论》、《数据结构与算法分析:C语言描述》等。通过阅读书籍可以更深入地了解数据结构与算法的背后原理和更高级的内容。 5. 参加算法竞赛或项目实践:参加算法竞赛可以提高算法的设计和编码能力,还可以通过与他人的交流和比拼来进一步提升自己。同时,参加项目实践可以将所学的数据结构与算法应用到实际项目中,加深对这些知识的理解和掌握。 总之,学习数据结构与算法需要结合理论与实践,不仅要掌握基本概念和知识,还需要不断练习和实践,才能真正掌握和应用它们。 ### 回答3: 学习数据结构与算法,首先要建立一种系统的学习方法和计划。以下是一些建议: 1.了解基础知识:学习数据结构和算法的前提是理解计算机的基础原理和操作系统的工作原理。这包括计算机内存、数据存储和读写、程序执行过程等基本概念。 2.选择合适的教材或资源:寻找一本好的教材或者在线资源,如教科书、编程网站等。建议选择结合理论和实践的资料,尽量包含编程实例和习题,以便动手实践和巩固所学知识。 3.学习基本数据结构:了解基本数据结构,如数组、链表、栈、队列、树等。理解它们的特点、应用场景和操作,能够利用编程语言实现和操作这些数据结构。 4.掌握常见算法:学习并掌握常见的算法,如查找、排序、递归、动态规划等。了解它们的思想、时间复杂度和空间复杂度,并能够使用适当的算法解决实际问题。 5.进行实践和练习:通过练习编写代码、解决问题来巩固所学知识。可以使用在线编程平台或者自己搭建的编程环境进行实践和调试。 6.参与项目和实际应用:将所学的数据结构和算法应用到实际项目中,从中获取更多的实践经验。参与开源项目、参加编程竞赛等也能够激发学习的兴趣和动力。 7.持续学习和拓展:数据结构和算法是一个广阔的领域,持续学习是必要的。可以阅读相关的学术论文、参加学术会议、关注计算机科学领域的最新动态,以保持对该领域的掌握和理解。 总结来说,学习数据结构与算法需要坚持不懈的实践与思考。只有通过不断地练习和不断地思考,才能真正掌握和理解数据结构与算法的精髓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值