first root

题目给出一棵二叉树的中序和后序排列。求出它的先序排列【提示】通过对比二叉树的中序和后序排列,我们可以找出根节点及左右子树。同样的,也可以通过对比左子树的中序和后序排列,找出左子树的根节点…….可见,该问题能够被递归描述。当找到最后一个根节点时,递归无法再进行下去,这就是递归结束的边界条件。

(1)输入://中序 b  a  c

//后序 b c  a

输出://先序 a  b  c

(2)输入://中序 c  b e  g  d f  a

//后序 c  g  e f   d  b  a

    /输出://先序 a  b c  d   e g  f  


分析:此题主要方向是利用指针和数组地址的连续性,先找后序序列中最后一个节点,即寻根操作;找到根节点后输出,即按照先根遍历规则:“根左右”;其后将左右子树切割开,先左后右进行递归输出。

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
void first_root(char *mid_s,char *last_s)
{
    if(!*mid_s)return;
    char t,*p,*q;
    p=last_s+strlen(last_s)-1;
    printf("%c",*p);
    q=strchr(mid_s,*p);
    *p=0;
    p=q-mid_s+last_s;
    t=*p;
    *p=*q=0;
    first_root(mid_s,last_s);
    *p=t;
    first_root(q+1,p);
}
int main()
{
    char mid_s[1001],last_s[1001];
    scanf("%s%s",mid_s,last_s);
    first_root(mid_s,last_s);
    return 0;
}


原文地址:https://www.cnblogs.com/keshuqi/p/5957796.html