二叉树的遍历序列求法

二叉树的前、中、后序遍历在面试题中是否常见,可以说是非常基础而又非常实用的算法。

树的遍历一颗

如图所示,前序遍历序列为:1 2 4 3 5
void dfs(int x)
{
	if(x==0) return;
	cout<<g[x].val<<" ";
	dfs(g[x].l);
	dfs(g[x].r);
}
中序遍历序列为:4 2 3 1 5
void dfs(int x)
{
	if(x==0) return;
	dfs(g[x].l);
	cout<<g[x].val<<" ";
	dfs(g[x].r);
}
后序遍历序列为:4 3 2 5 1
void dfs(int x)
{
	if(x==0) return;
	dfs(g[x].l);
	dfs(g[x].r);
	cout<<g[x].val<<" ";
}

容易看出三种遍历方法在代码中只有一行的区别,理解起来也非常简单。

已知两种遍历求第三种遍历序列

已知前序中序求后序:
int ask(int len,int pre,int in[])
{
	for(int i=1;i<=len;i++)
		if(in[i]==pre) return i;
}

void cal(int len,int pre[],int in[])
{
	if(len<=0) return;
	int root=ask(len,pre[1],in);
	cal(root-1,pre+1,in);
	cal(len-root,pre+root,in+root);
	cout<<pre[1]<<" ";
}

signed main()
{
	n=read();
	for(int i=1;i<=n;i++) pre[i]=read();
	for(int i=1;i<=n;i++) in[i]=read();
	cal(n,pre,in);
}
已知后序中序求前序:
int ask(int len,int pre,int in[])
{
	for(int i=1;i<=len;i++)
		if(in[i]==pre) return i;
}

void cal(int len,int h[],int in[])
{
	if(len<=0) return;
	int root=ask(len,h[len],in);
	cout<<h[len]<<" ";
	cal(root-1,h,in);
	cal(len-root,h+root-1,in+root);
}

signed main()
{
	n=read();
	for(int i=1;i<=n;i++) h[i]=read();
	for(int i=1;i<=n;i++) in[i]=read();
	cal(n,h,in);
}
已知前序后序求中序:

已知前后序遍历并不一定可以唯一确定一颗树,因此中序遍历不唯一。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snowy2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值