codevs 1013 求先序排列(二叉树遍历)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 1013 求先序排列(二叉树遍历)相关的知识,希望对你有一定的参考价值。
Description
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
Input
两个字符串,分别是中序和后序(每行一个)
Output
一个字符串,为二叉树的先序序列
Sample Input
BADC
BDCA
Sample Output
ABCD
思路
我们知道,前序遍历(PreOrder):根节点->左子树->右子树;中序遍历(InOrder):左子树->根节点->右子树;(PostOrder)后序遍历:左子树->右子数->根节点。故PostOrder的最后一个数为树根。由PostOrder找出树根后,可根据InOrder中分出树根的左右子树。InOrder中,树根左边为其左子树,右边为右子树。例如样例中:
in : BADC
post:BDCA
左子树为B,右子树为DC;在InOrder中找根的位置pos;
则左子树中序序列为In.substr(0,pos),后序序列为Post.substr(0,pos)
右子树的先序序列为In.subst(pos+1,len-pos-1),后序序列为post.substr(pos,len-pos-1)
通过递归不断重复以后步骤,当串为空时退出
#include<bits/stdc++.h> using namespace std; string in,post; void pre(string in,string post) { if (post.empty()) return; int pos,len = post.size(); char ch = post[len-1]; cout << ch; pos = in.find(ch); pre(in.substr(0,pos),post.substr(0,pos)); pre(in.substr(pos + 1,len - pos - 1),post.substr(pos,len - pos - 1)); } int main() { cin >> in >> post; pre(in,post); return 0; }
#include<bits/stdc++.h> using namespace std; const int maxn = 15; void pre(int N,char a[],char b[]) { if (N <= 0) return; int pos; for (int i = 0;i < N;i++) if (a[i] == b[N-1]) pos = i; printf("%c",b[N-1]); pre(pos,a,b); pre(N - pos - 1,a + pos + 1,b + pos); } int main() { char a[maxn],b[maxn]; scanf("%s %s",a,b); int len = strlen(a); pre(len,a,b); return 0; }
以上是关于codevs 1013 求先序排列(二叉树遍历)的主要内容,如果未能解决你的问题,请参考以下文章