P1030 [NOIP 2001 普及组] 求先序排列
/找右子树的根 k+1->结尾都是中序遍历的右子树 后序遍历的从k->结尾-1。//找左子树的根 0->k-1是中序遍历的左子树 k是中序遍历的根节点。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。//最后一个字符就是根节点 也就先序遍历的第一个节点。共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
·
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA
输出 #1复制
ABCD
#include <bits/stdc++.h> using namespace std; void dfs(string a,string b) { if(a.size()){ char c = b[b.size()-1];//递归寻找后序遍历的最后一个字符为分界线 cout<<c;//最后一个字符就是根节点 也就先序遍历的第一个节点 int k = a.find(c);//记录根的位置 dfs(a.substr(0,k),b.substr(0,k));//找左子树的根 0->k-1是中序遍历的左子树 k是中序遍历的根节点 dfs(a.substr(k+1),b.substr(k,b.size()-k-1));//找右子树的根 k+1->结尾都是中序遍历的右子树 后序遍历的从k->结尾-1 } } int main() { string inOrder,after; cin>>inOrder>>after; dfs(inOrder,after); return 0; }
更多推荐
所有评论(0)