大致思路:
最开始一直想着在字符串上“换顺序”,导致思路很不清晰。
其实,就活学活用已经掌握的方法——根据前序和中序遍历结果来构造二叉树!
构造二叉树之后,再对其进行后序遍历(递归的方法)。
要注意的点:
① 题目说输入“字符串”,但是其实一般来说,为了编程的方便,可以定义char数组来储存字符串并进行操作,用法如下:
char a[30]; //可以自设字符串大小
scanf("%s",a); //很灵活每次输入都相当于“刷新”。注意不加“&”,因为字符数组名a就是首地址,不需要再取地址!
int L = strlen(a); //求字符数组存储的字符串长度,用strlen
② 注意二叉树的结构体定义中,构造函数的写法。并且注意val值的类型是char不是int了。
AC代码:
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
struct BTNode
{
char val;
BTNode *left;
BTNode *right;
BTNode(char x): val(x),left(NULL),right(NULL){}
};
//将前序和中序遍历结果进行对照,划分出左子树+右子树,递归
BTNode * constru(char* pre,int preStart,int preEnd,char* in, int inStart,int inEnd)
{
if(preStart>preEnd || inStart>inEnd)
return NULL; //对照不了,因为此树为空
BTNode *head=new BTNode(pre[preStart]); //根节点
for(int i=inStart;i<=inEnd;i++)
{
if(in[i]==pre[preStart])
{
head->left = constru(pre,preStart+1,preStart+i-inStart,in,inStart,i-1);
head->right = constru(pre,preStart+i-inStart+1,preEnd,in,i+1,inEnd);
break;
}
}
return head;
}
void postOrder(BTNode* head)
{
if(head->left!=NULL)
postOrder(head->left);
if(head->right!=NULL)
postOrder(head->right);
cout<<head->val;
}
int main()
{
char pre[30],in[30];
while(scanf("%s",pre)!=EOF)
{
scanf("%s",in);
int L1 = strlen(pre);
int L2 = strlen(in);
BTNode *head = constru(pre,0,L1-1,in,0,L2-1);
//构造好这棵二叉树,对其后序遍历
postOrder(head);
cout<<endl;
}
return 0;
}