【题目描述】
由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树,所以对二叉树做如下处理,将二叉树的空结点用·补齐,如图所示。我们把这样处理后的二叉树称为原二叉树的扩展二叉树,扩展二叉树的先序和后序序列能唯一确定其二叉树。
现给出扩展二叉树的先序序列,要求输出其中序和后序序列。
【输入】
扩展二叉树的先序序列。
【输出】
输出其中序和后序序列。
【输入样例】
ABD..EF..G..C..
【输出样例】
DBFEGAC
DFGEBCA
题解
我们可以用递归的方法构建二叉树:
- 输入根节点。
- 递归建左子树。
- 递归建右子树。
- 将左右子树接在这棵树根结点的下面,返回根结点。
废话不多说 ,上代码
#include <bits/stdc++.h>
using namespace std;
struct Node{
char val;
int left, right;
};
Node node[1005];
int p;
void inOrder(int r){
if(r == 0) return ;
inOrder(node[r].left);
cout << node[r].val;
inOrder(node[r].right);
}
void postOrder(int r){
if(r == 0) return ;
postOrder(node[r].left);
postOrder(node[r].right);
cout << node[r].val;
}
int createTree(char val){
if(val == '.') return 0;
else{
int np = ++p;
node[np].val = val;
node[np].left = createTree(cin.get());
node[np].right = createTree(cin.get());
return np;
}
}
int main(int argc, const char * argv[]){
int root = createTree(cin.get());
inOrder(root);
cout << endl;
postOrder(root);
return 0;
}