题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘#’表示,例如AB#C##D##),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果。
输入
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘#’表示,连续输入t行。
输出
输出每个二叉树的先序遍历、中序遍历和后序遍历结果。
输入样例1
2
AB#C##D##
AB##C##
输出样例1
ABCD\n
BCAD\n
CBDA\n
ABC\n
BAC\n
BCA\n
\n
#include<iostream>
using namespace std;
class BiNode {
public:
char data;
BiNode* lchild, * rchild;
BiNode():lchild(NULL),rchild(NULL){}
BiNode(char c):data(c),lchild(NULL),rchild(NULL){}
};
class BiTree {
public:
BiNode* root;
BiTree():root(NULL){}
void CreateTree() {
CreateTree(root, NULL);
}
void CreateTree(BiNode*& t, BiNode* p) {
char c;
cin >> c;
if (c != '#') {
t = new BiNode(c);//建树只需要新建一个结点即可
CreateTree(t->lchild, t);
CreateTree(t->rchild, t);
}
else {
t = NULL;//这一点容易漏掉!!!
}
}
void PreOrder(BiNode*t) {
if (t) {
cout << t->data;
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
void PreOrder() {
PreOrder(root);
cout << endl;
}
void MidOrder(BiNode* t) {
if (t) {
MidOrder(t->lchild);
cout << t->data;
MidOrder(t->rchild);
}
}
void MidOrder() {
MidOrder(root);
cout << endl;
}
void PostOrder(BiNode* t) {
if (t) {
PostOrder(t->lchild);
PostOrder(t->rchild);
cout << t->data;
}
}
void PostOrder() {
PostOrder(root);
cout << endl;
}
};
int main() {
int t;
cin >> t;
while (t--) {
BiTree mytree;
mytree.CreateTree();//建树
mytree.PreOrder();//前序遍历
mytree.MidOrder();//中序遍历
mytree.PostOrder();//后序遍历
}
return 0;
}