题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果
输入
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行
输出
输出每个二叉树的先序遍历、中序遍历和后序遍历结果
输入样例1
2
AB0C00D00
AB00C00
输出样例1
ABCD
BCAD
CBDA
ABC
BAC
BCA
#include<iostream>
#include<string>
using namespace std;
class BiTreeNode {
public:
char data; //结点数据
BiTreeNode* LeftChild; //左子树指针
BiTreeNode* RightChild; //右子树指针
BiTreeNode() :LeftChild(NULL), RightChild(NULL) {}
~BiTreeNode() {}
};
class BiTree {
private:
BiTreeNode* Root;//根节点指针
int pos;
string strTree;
BiTreeNode* CreateBiTree();
void PreOrder(BiTreeNode* t);
void InOrder(BiTreeNode* t);
void PostOrder(BiTreeNode* t);
public:
BiTree() {}; //构造函数
~BiTree() {};//析构函数
void CreateTree(string TreeArray);//利用先序遍历解雇构建二叉树
void PreOrder();//前序遍历
void InOrder();//中序遍历
void PostOrder();//后序遍历
};
//构造二叉树,利用先序遍历结果建树
void BiTree::CreateTree(string TreeArray) {//公有函数,对外接口
pos = 0;
strTree.assign(TreeArray);
Root = CreateBiTree();
}
BiTreeNode* BiTree::CreateBiTree()//递归建树,私有函数,类内实现
{
BiTreeNode* T;
char ch;
ch = strTree[pos++];
if (ch == '0')
T = NULL;
else
{
T = new BiTreeNode();
T->data = ch;//生成根节点
T->LeftChild = CreateBiTree();//构造左子树
T->RightChild = CreateBiTree();//构造右子树
}
return T;
}
//定义先序遍历函数
void BiTree::PreOrder() { //公有函数,对外接口
PreOrder(Root);
}
void BiTree::PreOrder(BiTreeNode* t)
{//私有函数,类内实现
if (t)//若结点不为空
{
cout << t->data;//输出当前结点t的数据
PreOrder(t->LeftChild);//先序遍历t的左孩子
PreOrder(t->RightChild);//先序遍历t的右孩子
}
}
//定义中序遍历函数
void BiTree::InOrder() { //公有函数,对外接口
InOrder(Root);
}
void BiTree::InOrder(BiTreeNode* t)
{//私有函数,类内实现
if (t)//若结点t不为空
{
InOrder(t->LeftChild);//中序遍历t的左孩子
cout << t->data;//输出当前结点t的数据
InOrder(t->RightChild);//中序遍历t的右孩子
}
}
//后序遍历函数
void BiTree::PostOrder() { //公有函数,对外接口
PostOrder(Root);
}
void BiTree::PostOrder(BiTreeNode* t)
{//私有函数,类内实现
if (t)//若结点t不空
{
PostOrder(t->LeftChild);//后序遍历t的左孩子
PostOrder(t->RightChild);//后序遍历t的右孩子
cout << t->data;//输出当前结点t的数据
}
}
//主程序
int main()
{
int t;//用来记录输入的整数t,表示有t个二叉树
string s;//用来记录二叉树的先序遍历结果
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> s;
BiTree BT;
BT.CreateTree(s);//建树
BT.PreOrder();//先序遍历
cout << endl;
BT.InOrder();//中序遍历
cout << endl;
BT.PostOrder();//后序遍历
cout << endl;
}
return 0;
}