求先序遍历

传送门

(一道dfs的小水题)

前段时间校内集训的时候

学长还曾抛出过这个问题

然而我又咕掉了

(期中之后准备洗心革面的我决心从dfs开始复(学)

(卑微

----------------------------------------------------------------------------------------

题目描述

给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8 le 88)。

输入输出格式

输入格式:
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出格式:

 1行,表示一棵二叉树的先序。

 输入输出样例

输入样例#1:
BADC
BDCA
输出样例#1:
ABCD

----------------------------------------------------------------------------------------

先序遍历

根-->左子树-->右子树

中序遍历

左子树-->根-->右子树

后序遍历

左子树-->右子树-->根

层次遍历

仅仅需按层次遍历就可以

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

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

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

层次遍历:1 2 3 4 5 6 7 8

-----------------------------------------------------------------------------------------------

 由于后序遍历最后遍历到根的特点

所以后序遍历的最后一个点一定是根节点

由此在中序遍历的序列中

找到根节点

就可以把中序遍历分成两部分:左子树和右子书

递归下去就可以

-------------------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring> 
#include<iostream>
using namespace std;
char a[10],b[10];
int len;
void dfs(int l,int r,int ll,int rr)//后序遍历区间l,r;中序遍历区间ll,rr 
{
    if(l == r)
    {
        cout<<b[r];
        return;
    } 
    if(l > r)
        return;
    cout<<b[r];
    int cnt = 0,mrk;
    for(int i = ll;i <= rr;i++)
    {
        if(a[i] == b[r])
        {
            mrk = i;
            break;
        }
        else
            cnt++;
    }
    dfs(l,l+cnt-1,ll,mrk - 1);
    dfs(l+cnt,r - 1,mrk+1,rr);
}
int main()
{
    scanf("%s",a);
    scanf("%s",b);
    len = strlen(a);
    dfs(0,len - 1,0,len - 1);
    return 0;
}
原文地址:https://www.cnblogs.com/darlingroot/p/10851561.html