实训一#1.9二叉树遍历,从前序、中序到后序

【问题描述】

二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树,深度遍历有前序、中序以及后序三种遍历方法。

三种基本的遍历思想为:

前序遍历:根结点 ---> 左子树 ---> 右子树

中序遍历:左子树---> 根结点 ---> 右子树

后序遍历:左子树 ---> 右子树 ---> 根结点

比如,求以下二叉树的各种遍历

hhh.png

前序遍历:1  2  4  5  7  8  3  6 

中序遍历:4  2  7  5  8  1  3  6

后序遍历:4  7  8  5  2  6  3  1

需要你编写程序解决的问题是:已知一个二叉树的前序遍历和中序遍历的结果,给出该二叉树的后序遍历的结果。

【输入形式】

有多组测试数据,每组测试数据三行,每组测试数据第一行只有一个正整数n,表示二叉树节点的数目,n=0意味着输入结束并且不需要处理。

每组测试数据第二行是二叉树的前序遍历的结果,是一个长度为n的字符串,每个节点由一个字符表示,字符是大小写英文字母及10个数字,不同的节点用不同的字符表示,也即无论前序遍历和中序遍历的字符串中没有重复的字符。

每组测试数据第二行是二叉树的中序遍历的结果,也是一个长度为n的字符串。

40%的测试数据1 ≤ n≤ 10;

30%的测试数据1 ≤ n≤ 20;

20%的测试数据1 ≤ n≤ 40;

10%的测试数据1 ≤ n≤ 62;

【输出形式】

对于每组测试数据,输出一行,是一个长度为n的字符串,表示二叉树后序遍历的结果。

【样例输入】

8
12457836
42758136
4
abcd
abcd
4
abcd
dcba
0

【样例输出】

47852631
dcba
dcba

【样例说明】
【评分标准】

//方法一

#include<bits/stdc++.h>
using namespace std;
const int M=109;
int n;
char b[M];
map<char,int>p;
void solve(int l,int r){
	if(l>r)return;
	int mi=n+1,id = 0;
	for(int i=l;i<=r;++i){
		if(mi>p[b[i]])mi=p[b[i]],id=i;
	}
	solve(l,id-1);
	solve(id+1,r);
	cout<<b[id];
}
void work(){
	char s[M];
	cin>>(s+1)>>(b+1);
	for(int i=1;i<=n;++i)p[s[i]]=i;
	solve(1,n);
	cout<<endl;
}
int main(){
	while(1){
		cin>>n;
		if(!n)break;
		work();
	}
	return 0;
}

 

n = int(input())
sam = []
info = []
for i in range(n):
    info.append([input(), 0, 0, 0, 0])
for i in range(n*(n-1)//2):
    sam.append(input())
    ps = int(sam[i].split(' ')[1].split(':')[0])
    qs = int(sam[i].split(' ')[1].split(':')[1])
    p = sam[i].split('-')[0] 
    q = sam[i].split('-')[1].split(' ')[0]
    for i in info:
        for j in info:
            if p == i[0] and q == j[0]:
                if ps > qs: 
                    i[1] += 3
                elif ps < qs: 
                    j[1] += 3
                else: 
                    i[1] += 1
                    j[1] += 1
                i[3] += ps 
                i[4] += qs
                j[3] += qs
                j[4] += ps
for i in info: i[2] = i[3] - i[4] 
info.sort(key = lambda x: (x[1], x[2], x[3]), reverse = True)
result = info[:n//2]
result.sort()
for i in range(len(result)):
    print(result[i][0])






  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值