#include<bits/stdc++.h>
using namespace std;
/*已知先序和中序求后序*/
void transfer(char *preorder,char *inorder,int len)
{
int i,left_len,right_len;//left_len,right_len分别表示每次找到根之后左右子树的节点个数
left_len=right_len=0;
char *p,*q;//q指向先序,p指向中序
if(len==0)//长度为0就返回
return;
q=preorder;
p=inorder;
while(*p++!=*q)//循环结束时,说明找到了根的位置,然而此时的p指向根的后面一个元素因为++了,并且可以算出left_len,right_len
left_len++;
right_len=len-left_len-1;
transfer(q+1*sizeof(char),inorder,left_len);//左子树递归
transfer(q+(left_len+1)*sizeof(char),p,right_len);//右子树递归,注意这里的p不需要++,它已经指向刚才相等元素的后一个地址了,因为while语句中写的是*p++
printf("%c",*q);//打印元素,在左右之后打印也符合后序遍历的特点吧
}
int main()
{
char preorder[100],inorder[100];
while(scanf("%s%s",preorder,inorder)!=EOF)
{
transfer(preorder,inor
二叉树:已知先序遍历和中序遍历求后序遍历(同时也是华科某年上机题)
最新推荐文章于 2021-09-24 12:51:13 发布