题目描述
假设二叉树用二叉链表存储,用先序序列结果创建。输入二叉树的先序序列,请你先创建二叉树,并对树做个镜面反转,再输出反转后的二叉树的先序遍历、中序遍历、后序遍历和层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。
--程序要求--
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
程序中若include多过一个头文件,不看代码,作0分处理
不允许使用第三方对象或函数实现本题的要求
输入
测试次数t
每组测试数据是一个二叉树的先序遍历序列,#表示空树
输出
对每棵二叉树,输出镜面反转后的先序、中序、后序和层次遍历序列。如果空树,输出四个NULL(后面不加空格)。如下:
NULL
NULL
NULL
NULL
代码思路:
没必要纠结怎么翻转,两个方法,一是先序存储时左子树结点存在右子树结点,二是每种遍历方法中左右互换,最麻烦在于水平遍历不能使用头文件stack,我们可以自己写一个简单的stack类,我就数组去存储,这样更简单一点。
#include<iostream>
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() {
BiTreeNode* T;
char ch;
ch = strTree[pos++];
if (ch == '#')
T = NULL;
else {
T = new BiTreeNode();
T->data = ch;
T->LeftChild = CreateBiTree();
T->RightChild = CreateBiTree();
}
return T;
}
void PreOrder(BiTreeNode* t) {//先序遍历
if (t) {
cout << t->data << ' ';
PreOrder(t->RightChild);
PreOrder(t->LeftChild);
}
}
void InOrder(BiTreeNode* t) {//中序遍历
if (t) {
InOrder(t->RightChild);
cout << t->data << ' ';
InOrder(t->LeftChild);
}
}
void PostOrder(BiTreeNode* t) {//后序遍历
if (t) {
PostOrder(t->RightChild);
PostOrder(t->LeftChild);
cout << t->data << ' ';
}
}
void LevelOrder(BiTreeNode* t) {//水平遍历
if (t) {
int i = 0, j = 0;
BiTreeNode* tq[50];
BiTreeNode* p = t;
if (p)
tq[j++] = p;
while (i != j)
{
p = tq[i];
tq[i++] = 0;
if (p)
{
cout << p->data << ' ';
tq[j++] = (p->RightChild);
tq[j++] = p->LeftChild;
}
}
}
}
public:
BiTree() {};
~BiTree() {};
void CreateTree(string TreeArray) {
pos = 0;
strTree.assign(TreeArray);
Root = CreateBiTree();
}
void PreOrder() {
if (Root) {
PreOrder(Root);
cout << endl;
}
else
cout << "NULL" << endl;
}
void InOrder() {
if (Root) {
InOrder(Root);
cout << endl;
}
else
cout << "NULL" << endl;
}
void PostOrder() {
if (Root) {
PostOrder(Root);
cout << endl;
}
else
cout << "NULL" << endl;
}
void LevelOrder() {
if (Root) {
LevelOrder(Root);
cout << endl;
}
else
cout << "NULL" << endl;
}
};
int main() {
int t;
cin >> t;
while (t--) {
string str;
BiTree tree;
cin >> str;
tree.CreateTree(str);
tree.PreOrder();
tree.InOrder();
tree.PostOrder();
tree.LevelOrder();
}
return 0;
}