Description
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘#’表示,例如AB#C##D##),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果。
A
/ \
B D
\
C
Input
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘#’表示,连续输入t行。
Output
输出每个二叉树的先序遍历、中序遍历和后序遍历结果。
Sample
samplein
2
AB#C##D##
AB##C##
sampleout
ABCD
BCAD
CBDA
ABC
BAC
BCA
AC代码
#include <iostream>
#include <string>
using namespace std;
class TreeNode {
public:
char data;
TreeNode* LeftChild;
TreeNode* RightChild;
TreeNode* parent;
};
class Bitree {
public:
TreeNode* root;
int flag;
Bitree(const string& str) {
flag = 0;
int pos = 0;
root = createTree(str, pos);
}
TreeNode* createTree(const string& str, int& pos) {
if (pos >= str.length()) {
return nullptr;
}
char ch = str[pos++];
if (ch == '#') {
return nullptr;
}
else {
TreeNode* b = new TreeNode();
b->data = ch;
b->LeftChild = createTree(str, pos);
if (b->LeftChild != nullptr) {
b->LeftChild->parent = b;
}
b->RightChild = createTree(str, pos);
if (b->RightChild != nullptr) {
b->RightChild->parent = b;
}
return b;
}
}
void getLchildLeaf(TreeNode* b) {
if (b != nullptr && b->parent != nullptr && b->parent->LeftChild == b) {
if (b->LeftChild == nullptr && b->RightChild == nullptr) {
flag++;
}
}
if (b->LeftChild != nullptr) {
getLchildLeaf(b->LeftChild);
}
if (b->RightChild != nullptr) {
getLchildLeaf(b->RightChild);
}
}
void preorderTraversal(TreeNode* root) {//先序输出函数
if (root == nullptr) {
return;
}
cout << root->data;// << " "; // 输出根节点
preorderTraversal(root->LeftChild); // 先序遍历左子树
preorderTraversal(root->RightChild); // 先序遍历右子树
}
void inorderTraversal(TreeNode* root) {//中序输出函数
if (root == nullptr) {
return;
}
inorderTraversal(root->LeftChild); // 中序遍历左子树
cout << root->data;// << " "; // 输出根节点
inorderTraversal(root->RightChild); // 中序遍历右子树
}
void postorderTraversal(TreeNode* root) {//后序输出函数
if (root == nullptr) {
return;
}
postorderTraversal(root->LeftChild); // 后序遍历左子树
postorderTraversal(root->RightChild); // 后序遍历右子树
cout << root->data; //<< " "; // 输出根节点
}
};
int main() {
int t;
cin >> t;
while (t--) {
string str;
cin >> str;
Bitree bt(str);
bt.preorderTraversal(bt.root);
cout <<endl;
bt.inorderTraversal(bt.root);
cout << endl;
bt.postorderTraversal(bt.root);
cout << endl;
}
return 0;
}