YES
题目:已知二叉树中序、后序,求其层次遍历
//已知中序、后序,求层次遍历
#include <cstdio>
#include <iostream>
#include <string>
#include <queue>
using namespace std;
//const int LEN = 105;
typedef struct node{
char data;
struct node *lchild, *rchild;
}BiNode,*BiTree;
string inorder, postorder;
void CreatTree(int left1, int right1, int left2, int right2, BiTree &bt) {
if (left1 > right1 || left2 > right2) return; //递归出口(因为长度一样,所以实际判断一个即可)
bt = new BiNode;
bt->data = postorder[right2];
bt->lchild = bt->rchild = NULL;
int pos = inorder.find(bt->data); //找到当前根结点在中序中的位置
CreatTree(left1,pos-1,left2,pos-left1-1+left2,bt->lchild);
CreatTree(pos+1,right1,pos - left1 + left2,right2-1,bt->rchild);//此处的para3参照上面的para4
}
void LevelOrder(BiTree bt) {
queue<BiNode *> Q;
if (!bt) return;
Q.push(bt);
while (!Q.empty()) {
BiNode *bn = Q.front(); //返回第一个结点
Q.pop();
printf("%c", bn->data);
if (bn->lchild) {
Q.push(bn->lchild);
}
if(bn->rchild){
Q.push(bn->rchild);
}
}
printf("\n");
}
void Delete(BiTree &bt) { //递归删除结点
if (!bt) return;
Delete(bt->lchild);
Delete(bt->rchild);
free(bt);
}
int main() {
//freopen("F:\\算法设计、分析与应用教程\\source\\repos\\Accepted\\Dream.txt","r",stdin);
//freopen("F:\\算法设计、分析与应用教程\\source\\repos\\Accepted\\Dream1.txt","w",stdout);
BiTree bt;
while (cin >> inorder >> postorder) {
CreatTree(0,inorder.size()-1,0,postorder.size()-1,bt);
LevelOrder(bt);
Delete(bt);
}
//fclose(stdin);
//fclose(stdout);
return 0;
}