题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构。
编写程序输出该树的所有叶子结点和它们的父亲结点
输入
第一行输入一个整数t,表示有t个二叉树
第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行
输出
第一行按先序遍历,输出第1个示例的叶子节点
第二行输出第1个示例中与叶子相对应的父亲节点
以此类推输出其它示例的结果
输入样例1
3
AB0C00D00
AB00C00
ABCD0000EF000
输出样例1
C D \n
B A \n
B C \n
A A \n
D F \n
C E \n
#include<iostream>
#include<queue>
using namespace std;
class BiNode {
public:
char data;
BiNode* lchild, * rchild;
BiNode* parent;
BiNode() :lchild(NULL), rchild(NULL), parent(NULL) {}//无参构造初始化
BiNode(char c) :data(c), lchild(NULL), rchild(NULL), parent(NULL) {}//有参构造
friend class BiTree;
};
class BiTree {
BiNode* root;
queue<BiNode*> leaf;//两个队列,存储用于输出的数据
queue<BiNode*> parent;
void CreateTree(BiNode*& t, BiNode* p) {//记录当前节点和当前结点的双亲,t为指针变量引用,不改变原来的值。
char c;
cin >> c;//每进来一次都判断一次
if (c != '0') {
t = new BiNode(c);
t->parent = p;
CreateTree(t->lchild, t);//从t之后找左子树并建立
CreateTree(t->rchild, t);//找右子树并建立
}
else {
t = NULL;
}
}
void PreOrder(BiNode* t) {//前序遍历,如果不存在左子树和右子树,就压入(前序是先操作,再左右)
if (t)
{
if (!t->lchild && !t->rchild)
{
leaf.push(t);
parent.push(t->parent);
}
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
public:
BiTree() :root(NULL) {}
void CreateTree() {//建树从根开始
CreateTree(root, NULL);
}
void PreOrder() {
PreOrder(root);//从根开始
while (!leaf.empty()) {//输出叶子
cout << leaf.front()->data << " ";
leaf.pop();
}
cout << endl;
while (!parent.empty()) {//输出双亲
cout << parent.front()->data << " ";
parent.pop();
}
cout << endl;
}
};
int main() {
int t;
cin >> t;
while (t--) {
BiTree mytree;
mytree.CreateTree();
mytree.PreOrder();
}
return 0;
}