1、这里用 数组 indx[i] 记录字符的 ASCII 码是 i 的字母在中序字符串 s1 的下标
vis[i] 字符的 ASCII 码是 i 的字母表示是否进过队列(也就是否被访问过)
2、用 队列 queue 模拟二叉树的层序遍历建立过程, 用题目样例说明
中序 DBEAC
层序 ABCDE
显然 节点 A 是根节点,然后 A 进队列, A 出列,判断A是否有左子树和右子树,
在中序序列 s1 中找到 A 字母,判断A的相邻两个字母是否被访问过。
EAC, E没有被访问过, 所以A有左子树, 那么 中序序列, B 进队列, B 是A的左子树根节点
C没有被访问过, 所以A有右子树, 那么 中序序列, C 进队列, C 是A的左子树根节点
一直扫描 层序 序列,重复这个动作,就可以建立一颗二叉树。
中序序列的左右,是判断某个节点是否有左右孩子节点。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
const int MaxN = 10010;
char s1[MaxN], s2[MaxN];
bool vis[MaxN];
int indx[MaxN];
typedef struct Node
{
char data;
Node* lchild;
Node* rchild;
}node, *pNode