(写此题前需先熟练二叉树的性质和相关操作)
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA
输出 #1复制
ABCD
解题思路:通过二叉树的后序遍历 和 中序遍历 可以逐个确定根结点 利用深度优先搜索算法(DFS) 递归寻找根节点,找到一个输出一个 知道得到先序遍历结果
AC代码:
#include <stdio.h>
#include <string.h>
char Inorder[9];
char Postorder[9];
int len;
//寻找根结点在中序排列中的位置
int Search_root(char s)
{
for(int i=0; i<len; i++)
{
if(Inorder[i] == s) return i;
}
}
void dfs(int front1,int rear1,int front2,int rear2)
{
int root = Search_root(Postorder[rear2]);
printf("%c",Postorder[rear2]);
//有左子树 搜索左子树
if(root > front1) dfs(front1, root-1,front2,rear2 - rear1 + root -1);
//有右子树 搜索右子树
if(root < rear1) dfs(root+1,rear1,front2 - front1 + root ,rear2-1);
}
int main()
{
scanf("%s",Inorder);
scanf("%s",Postorder);
len = strlen(Inorder);
dfs(0,len-1,0,len-1);
}