首页 > 其他分享 >图论——树有关知识

图论——树有关知识

时间:2024-02-24 11:57:06浏览次数:20  
标签:图论 后序 int 前序 知识 节点 char 中序 有关

树的遍历顺序有关

前序,中序,后序概念自行百度

知道几种顺序来确定二叉树形态

首先先明确一点至少要知道两种顺序以上才能确定一个树,因为如果只知道前序或者后序就只能确定根节点,而不能确定根节点的左右子树。但如果知道中序,那就不能确定根节点。

然后如果知道两种顺序的话,必须要知道中序,因为另外一种顺序可以确定根节点,中序来确定根节点的左右子树,然后再根据前序后者后序确定根节点的左右儿子。

具体确定代码实现(前序+中序)

#include<bits/stdc++.h>
using namespace std;
const int N=5e3+50;
string s,t;
int n;
void solve(int l,int r,int ml,int mr)
{
	if(l>r)
		return;
	if(l==r)
	{
		cout<<s[l];
		return;
	}
	int pos;
	for(int i=ml;i<=mr;i++)
		if(t[i]==s[l])
			pos=i;
	solve(l+1,l-ml+pos,ml,pos-1);solve(l-ml+pos+1,r,pos+1,r);
	cout<<s[l];
	return;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>s>>t;
	n=s.length();
	s=" "+s;t=" "+t;
	solve(1,n,1,n);
	return 0;
}

结合代码还是很好理解的。

但还有一种题型,就是已知前序和后序,求有多少种二叉树满足这种遍历顺序。

我们能确定根节点,但是不能确定根节点有一个儿子还是两个儿子。如果一个点有一个儿子,那么就有两种情况,儿子朝左朝右都可以。比如看前序遍历的第二个数,再在后序中找到,如果在后序的下一个位置为根,那么证明根节点只有一个儿子。否则就有两个儿子。

具体代码实现如下。

#include<bits/stdc++.h>
using namespace std;
const int N=5050;
long long ans;
int n,m;
char a[N],b[N];
int main(){
	scanf("%s %s",a,b);
	n=strlen(a);
	for(int i=0;i<n-1;i++)
		for(int j=1;j<n;j++)
			if(a[i]==b[j]&&a[i+1]==b[j-1])ans++;
	printf("%lld\n",(1ll<<ans));
	return 0;
}

多叉树转二叉树

记住口诀** “左儿子,右兄弟” **。

\(Code\):

#include<bits/stdc++.h>
using namespace std;
const int N=150;
map<char,char> son,L,R;
map<char,bool> mp,F,xx;
bool hav[N];
char root;int n;
void pre(char u)
{
	cout<<u;
	if(hav[u])pre(L[u]);
	if(mp[u])pre(R[u]);
	return;
}
void mid(char u)
{
	if(hav[u])mid(L[u]);
	cout<<u;
	if(mp[u])mid(R[u]);
	return;
}
void su(char u)
{
	if(hav[u])su(L[u]);
	if(mp[u])su(R[u]);
	cout<<u;
	return;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		char u;cin>>u;xx[u]=true;
		char x;
		while(1)
		{
			cin>>x;
			if(x=='0')break;
			F[x]=true;
			if(!hav[u])L[u]=x;
			else R[son[u]]=x,mp[son[u]]=true;
			son[u]=x;hav[u]=true;
		}
	}
	for(char i='A';i<='Z';i++)
	{
		if(xx[i]&&!F[i])
		 	root=i;
	}
	pre(root);cout<<endl;mid(root);cout<<endl;su(root);
	return 0;
}

标签:图论,后序,int,前序,知识,节点,char,中序,有关
From: https://www.cnblogs.com/CQWYB/p/18030916

相关文章

  • ACM基础数学知识
    1、异或相同的数,异或结果为0,不同的数,异或结果为1.异或会用在nim博弈和一些数学中。可以找出n+1个数中,唯一一个与其他的数不同的数异或有个性质:一个数对另一个数异或两次,数值不变。性质应用:交换两个数x=x^y;//x=3^4y=x^y;//y=3^4^4=3x=x^y;//x=......
  • Leecode知识点
    创建结构体指针:varlist*ListNode=&ListNode(0,head)上面的写法等同于list:=  &ListNode(0,head)要想创建一个链表,首先要创建一个表头num:=new(ListNode)然后将其进行数据赋值以及链接到下一个middle:=num //这里对middle进行修改之......
  • (笔记)Linux基础知识点总结
     一、从认识操作系统开始 1、操作系统简单分类Windows​目前最流行的个人桌面操作系统,不做多的介绍,大家都清楚。界面简单易操作,软件生态非常好。Unix​最早的多用户、多任务操作系统。后面崛起的Linux在很多方面都参考了Unix。目前这款操作系统已......
  • 医疗大模型:数据+知识双轮驱动实现医学推理、医患问答、病历自动生成、临床决策,为未来
    医疗大模型:数据+知识双轮驱动实现医学推理、医患问答、病历自动生成、临床决策,为未来医疗服务提供全新可能性1.指令数据集构建目前大多数开源的ChatLLM项目使用的是其他模型(如:ChatGPT)生成的指令数据,其不可避免的存在数据幻想的问题,数据幻想问题将严重影响LLM在实际场景中的应用......
  • 医疗大模型:数据+知识双轮驱动实现医学推理、医患问答、病历自动生成、临床决策,为未来
    医疗大模型:数据+知识双轮驱动实现医学推理、医患问答、病历自动生成、临床决策,为未来医疗服务提供全新可能性1.指令数据集构建目前大多数开源的ChatLLM项目使用的是其他模型(如:ChatGPT)生成的指令数据,其不可避免的存在数据幻想的问题,数据幻想问题将严重影响LLM在实际场景中的应用......
  • Codeforces 图论题
    CF243BHydra枚举点\(u,v\),或者说枚举边。然后找出\(u,v\)分别所连的点。有数组\(st\),结点\(x\)仅与\(u\)相邻则\(st[x]=1\),仅与\(v\)相邻则\(st[x]=2\),与两个点都相邻则\(st[x]=3\)。用数组\(rest\)记录\(st[x]=3\)的所有\(x\)。先优先选走至多\(h\)个\(......
  • 【图论】基环树 学习笔记
    基环树下面几个条件互相等价:一个图(连通块)是基环树联通块有n个点n条边图上存在且仅存在一个环,且环上每个节点是一颗子树的根。通常情况下树指的都是无向图,但是有向图也可以构成基环树。内向基环树:每个点都有一条出边。容易发现沿着这条边一定会走到环上“向内走”。外......
  • html四边形的的框怎么编写,html知识点之利用css四边形切角并且加上边框
    前言这几个月做了很多前端工作,其中一个需求还是蛮头疼,UI给的图上面的四边形是一个带斜边的,直接用背景图可以实现,但是会出现各种布局的问题,比如内容太大了,边框不会跟着扩大,废话不多说,这里写一些如何利用css话四边形带有斜边,并且给斜边加边框,在这之前,先简单说一下需要用到的函数li......
  • 跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级
    跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA)介绍:首先在Ziya-LLaMA-13B-V1基线模型的基础上加入中医教材、中医各类网站数据等语料库,训练出一个具有中医知识理解力的预训练语言模型(pre-trainedmodel),之后在此基础上通过......
  • c# Unit of Work 知识分享
    老规矩,先说一下UnitofWork是什么:UnitofWork(工作单元)是一种设计模式,通常用于管理数据库事务和持久化操作。它有助于确保数据操作的一致性和完整性,同时减少不必要的数据库操作,提高性能。在软件开发中,UnitofWork模式通常与Repository模式一起使用。下面是UnitofWork......