2.6 NC16692求先序排列题解

#include<iostream>
#include<cstring>
using namespace std;

void tree(string s1, string s2)
{
    int len1=s1.size();	 
	int len2=s2.size();
	if(len1>0){	 
		char ch=s2[len2-1];	//根节点 
		cout<<ch;	//每次递归输出根节点 
		int pos=s1.find(ch);	//在s1中找到ch出现的位置 
		tree(s1.substr(0,pos),s2.substr(0,pos));	//递归左子树 
		tree(s1.substr(pos+1),s2.substr(pos,len1-pos-1));	//递归右子树 
	}
}
int main()
{
    string a, b; cin >> a >> b;
    tree(a, b);
}

上面是题解代码

一. 思路

通过递归遍历左子树和右子树并直接输出根节点

二. 细节

因为先序遍历是递归输出左子树和右子树的根节点。所以我们只需要找到左子树,右子树的根节点,并且直接将其输出就可以。

我们知道后序的最后一个节点是根节点。也就是说中序遍历里面它的左边和右边分别是它的两棵子树。并且有一个很有趣的结论: 设中序遍历的字符串从开头到根结点的距离为n。对应的后续遍历的前n个字母, 他们就是根节点的左子树的后续遍历。大家可以尝试自行推导一下右子树。

基于以上两点,我们可以递归的完成这个题目。

三. 补充

用到了STL库中的 substr() , 

函数语法

SUBSTR (str, pos)
截取从pos位置开始到最后的所有str字符串

SUBSTR (str, pos, len)

参数说明:

  • str为列名/字符串;
  • pos为起始位置;mysql中的起始位置pos是从1开始的;如果为正数,就表示从正数的位置往下截取字符串(起始坐标从1开始),反之如果起始位置pos为负数,那么 表示就从倒数第几个开始截取;
  • len为截取字符个数/长度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值