题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构。
编写程序输出该树的所有叶子结点和它们的父亲结点
输入
第一行输入一个整数t,表示有t个二叉树
第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行
输出
第一行按先序遍历,输出第1个示例的叶子节点
第二行输出第1个示例中与叶子相对应的父亲节点
以此类推输出其它示例的结果
样例输入
3
AB0C00D00
AB00C00
ABCD0000EF000
样例输出
C D
B A
B C
A A
D F
C E
在递归遍历的时候传入父节点的data,若判断为叶子节点则将该data入队
#include<iostream>
#include<queue>
#include<string>
using namespace std;
class BitreeNode
{
public:
char data;
BitreeNode *left;
BitreeNode *right;
BitreeNode() :left(NULL), right(NULL) {}
~BitreeNode() {}
};
class Bitree
{
private:
BitreeNode *Root;
int pos;
string strtree;
BitreeNode *CreateBitree();
void countleaves(BitreeNode *t,char fatherdata);
public:
queue<char> q;
Bitree() {};
~Bitree() {};
void CreateTree(string TreeArray);
void countleaves();
};
void Bitree::CreateTree(string treearray)
{
pos = ;
strtree.assign(treearray);
Root = CreateBitree();
}
BitreeNode *Bitree::CreateBitree()
{
BitreeNode *T;
char ch;
ch = strtree[pos++];
if (ch == '')
T = NULL;
else
{
T = new BitreeNode();
T->data = ch;
T->left = CreateBitree();
T->right = CreateBitree();
}
return T;
}
void Bitree::countleaves()
{
pos = ;
countleaves(Root,Root->data);
cout << endl;
while (!q.empty())
{
cout << q.front()<<" ";
q.pop();
}
cout << endl;
}
void Bitree::countleaves(BitreeNode *t,char fatherdata)
{
if (t)
{
if (!t->left && !t->right)
{
cout << t->data << " ";
q.push(fatherdata);
}
countleaves(t->left,t->data);
countleaves(t->right,t->data); }
}
int main()
{
int t;
cin >> t;
while (t--)
{
string str;
cin >> str;
Bitree *tree;
tree = new Bitree();
tree->CreateTree(str);
tree->countleaves();
}
}