Description
给定一颗二叉树的逻辑结构,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构。
编写程序输出该树的所有叶子结点和它们的父亲结点
Input
第一行输入一个整数t,表示有t个二叉树
第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行
Output
第一行按先序遍历,输出第1个示例的叶子节点
第二行输出第1个示例中与叶子相对应的父亲节点
以此类推输出其它示例的结果
Sample
samplein
3
AB0C00D00
AB00C00
ABCD0000EF000
sampleout
C D
B A
B C
A A
D F
C E
AC代码
#include <iostream>
#include <queue>
using namespace std;
// 二叉树的链式存储结构
class TreeNode {
private:
char data; // 数据域
TreeNode* LeftChild; // 左孩子
TreeNode* RightChild; // 右孩子
public:
TreeNode(char value) : data(value), LeftChild(nullptr), RightChild(nullptr) {}
~TreeNode() {
delete LeftChild;
delete RightChild;
}
friend class Binary_tree;
};
class Binary_tree {
private:
TreeNode* Root; // 根结点
int pos;
string str;
TreeNode* CreateBinary_tree() { // 先序建立二叉树
TreeNode* t = nullptr;
char ch = str[pos++];
if (ch != '0') { // 结点不为空
t = new TreeNode(ch);
t->LeftChild = CreateBinary_tree();
t->RightChild = CreateBinary_tree();
}
return t; // 返回根结点
}
void getLeaf(TreeNode* t, char ch) { // 获取叶子结点和父亲结点
if (t != nullptr) {
if (t->LeftChild == nullptr && t->RightChild == nullptr) { // 若该结点左右孩子为空,则为叶子结点
cout << t->data << " ";
Q.push(ch);
}
getLeaf(t->LeftChild, t->data);
getLeaf(t->RightChild, t->data);
}
}
public:
queue<char> Q; // 创建队列Q用于存储叶子结点相对应的父亲节点
Binary_tree() : Root(nullptr), pos(0) {}
~Binary_tree() {
delete Root;
}
void CreateTree(string tree_array) {
pos = 0;
str = tree_array;
Root = CreateBinary_tree();
}
void getLeaf() {
getLeaf(Root, Root->data);
}
};
int main() {
int t;
cin >> t;
while (t--) {
string str;
Binary_tree Bt;
cin >> str;
Bt.CreateTree(str);
Bt.getLeaf(); // 输出叶子结点
cout << endl;
while (!Bt.Q.empty()) { // 输出叶子相对应的父亲节点
cout << Bt.Q.front() << " ";
Bt.Q.pop();
}
cout << endl;
}
return 0;
}