题目描述
假设二叉树用二叉链表存储,用先序序列结果创建。输入二叉树的先序序列,请你先创建二叉树,并对树做个镜面反转,再输出反转后的二叉树的先序遍历、中序遍历、后序遍历和层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。
输入
测试次数t
每组测试数据是一个二叉树的先序遍历序列,#表示空树
输出
对每棵二叉树,输出镜面反转后的先序、中序、后序和层次遍历序列。如果空树,输出四个NULL(后面不加空格)。如下:
NULL
NULL
NULL
NULL
输入样例1
3
41#32###65##7##
AB#C##D##
AB##C##
输出样例1
4 6 7 5 1 3 2
7 6 5 4 3 2 1
7 5 6 2 3 1 4
4 6 1 7 5 3 2
A D B C
D A C B
D C B A
A D B C
A C B
C A B
C B A
A C B
NOTICE:这道题有点投机取巧,我并没有专门写一个函数来实现镜面反转,二是在创建二叉树的时候直接将原来的左右孩子进行调换,省事;之后就是常规操作,先序、中序、后序、层次(队列实现)遍历。
#include <iostream>
#include <string>
#include <queue>
using namespace std;
class BiTreeNode
{
public:
char data;
BiTreeNode* lchild;
BiTreeNode* rchild;
BiTreeNode() :data(' '),lchild(nullptr), rchild(nullptr) {}
~BiTreeNode() {}
};
class BiTree
{
private:
BiTreeNode* root;
BiTreeNode* Create(string s, int& i)
{
BiTreeNode* t = nullptr;
if (s[i] != '#')
{
t = new BiTreeNode;
t->data = s[i];
//翻转:原来的右孩子在前面,原来的左孩子在后面
t->rchild = Create(s, ++i);
t->lchild = Create(s, ++i);
}
return t;
}
void PreOrder(BiTreeNode* t)
{
if (t)
{
cout << t->data << " ";
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
void InOrder(BiTreeNode* t)
{
if (t)
{
InOrder(t->lchild);
cout << t->data << " ";
InOrder(t->rchild);
}
}
void LastOrder(BiTreeNode* t)
{
if (t)
{
LastOrder(t->lchild);
LastOrder(t->rchild);
cout << t->data << " ";
}
}
public:
BiTree() :root(nullptr) {}
void Create(string s)
{
int i = 0;
root = Create(s, i);
}
void PreOrder()
{
if (root == nullptr)
cout << "NULL";
else
PreOrder(root);
cout << endl;
}
void InOrder()
{
if (root == nullptr)
cout << "NULL";
else
InOrder(root);
cout << endl;
}
void LastOrder()
{
if (root == nullptr)
cout << "NULL";
else
LastOrder(root);
cout << endl;
}
void LayerOrder()
{
if (root == nullptr)
{
cout << "NULL";
return;
}
queue<BiTreeNode*> q;
q.push(root);
while (!q.empty())
{
if(q.front()->lchild!=nullptr)
q.push(q.front()->lchild);
if(q.front()->rchild!=nullptr)
q.push(q.front()->rchild);
cout << q.front()->data << " ";
q.pop();
}
cout << endl;
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
BiTree mytree;
string s;
cin >> s;
mytree.Create(s);
mytree.PreOrder();
mytree.InOrder();
mytree.LastOrder();
mytree.LayerOrder();
}
return 0;
}