确定二叉树结构

问题:给出一颗二叉树的中序遍历和后序遍历,求其前序遍历。

思路:后序遍历中,最后一个节点一定是根节点rt,中序遍历中rt左边的节点是左子树,右边的节点为右子树。对子树再重复上述过程即可。因为要求前序遍历,顺序为根,左子树,右子树。所以在求左子树的根之前输出根节点即可。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
string s1,s2;
void dfs(int l1,int r1,int l2,int r2){
    int rt=s1.find(s2[r2]);
    printf("%c",s2[r2]);
    if(rt>l1)dfs(l1,rt-1,l2,l2+rt-l1-1);
    if(rt<r1)dfs(rt+1,r1,l2+rt-l1,r2-1);

}
int main(){
    cin>>s1>>s2; //中序序列,后序序列。
    int len=s1.size();
    dfs(0,len-1,0,len-1);
    printf("\n");
}

dfs函数功能为对中序序列 [l1,r1] 后序序列 [l2,r2]求前序遍历。

s2[r2]是后序序列中最后一个节点,为当前子树的根, rt是这个根在前序序列中的下标。

如果rt>l1,说明具有左子树,rt<r1,说明具有右子树。

求出根rt后,

中序序列[l1,r1]中,[l1,rt-1]是左子树,[rt+1,r1]为右子树。左子树有rt-l1个元素

后序序列[l2,r2]中,r2是根,左子树为前rt-l1个元素,即[l2,l2+rt-l1-1],右子树为剩下的元素为[l2+rt-l1,r2-1];


https://www.luogu.org/problemnew/show/P1030

原题是给前序和中序求后序,稍作修改即可~

https://www.luogu.org/problemnew/show/UVA536

猜你喜欢

转载自blog.csdn.net/u011737864/article/details/80978992