题目描述:
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
代码:
#include<stdio.h> #include<algorithm> #include<iostream> #include<cstring> using namespace std; const int MAXN = 27; char Pre[MAXN]; char In[MAXN]; void Make_root(char* Pre, char *In, int lgt){ int i, j; if(lgt<=0) return; char root=Pre[0]; char left[MAXN], right[MAXN]; char In_left[MAXN], In_right[MAXN]; //中根遍历根前面的都是属于左子树 for(i=0;In[i]!=root;i++) In_left[i]=In[i]; //先根遍历,根后左子树的个数是左子树 for(j=1;j<=i;j++) left[j-1]=Pre[j]; Make_root(left,In_left,i); i++; //中根遍历,根后面的都是右子树 for(j=0;j+i<lgt;j++) In_right[j]=In[j+i]; //先根遍历,根后面的都是右子树 for(j=0;j+i<lgt;j++) right[j]=Pre[j+i]; Make_root(right,In_right,lgt-i); printf("%c",root); } int main(){ while(~scanf("%s%s",Pre,In)){ int lgt=strlen(Pre); Make_root(Pre,In,lgt); puts(""); } }
思路:
采取递归的思路去做,不要求建树就可以直接找规律进行后序遍历,
先序遍历: 根+左子树的先序遍历+右子树的先序遍历
中序遍历: 左子树的中序遍历+根+右子树的中序遍历
所以递归思路是,从先序序列中读取根,从中序遍历中找出左子树的数量,再回先序遍历中找到左子树的先序遍历
这样就可以找出左子树的先序遍历和中序遍历数组,进行递归,
递归左子树和右子树,最后输出根节点,即使后序遍历。
时间: 2024-11-15 11:25:24