直接看代码:
#include<iostream>
#include<string>
#include<queue>
using namespace std;
//通常地建立结点
class Node{
public:
char data;
Node *left,*right,*parent;
Node(char ch){
data=ch;
left= nullptr;
right= nullptr;
parent= nullptr;
}
void setLeft(Node *left) {
Node::left = left;
}
void setRight(Node *right) {
Node::right = right;
}
void setParent(Node *parent) {
Node::parent = parent;
}
};
//建立二叉树
class Tree{
Node *root;
int pos;
string strTree;
queue<Node*> q;
public:
//这两个create不用怎么说了吧,就是建树而已
void create(string s){
pos=0;
strTree=s;
root=createTree();
}
Node* createTree(){
Node *t;
char ch=strTree.at(pos++);
if(ch=='0'){
t=nullptr;
}else{
t=new Node(ch);
t->setLeft(createTree());
//这里为左右结点设置父亲结点得关注一下
//先给左结点设置一个值,它不为空就为左结点设置父结点
//t本身就是其左右的父亲
if(t->left!=nullptr){
t->left->setParent(t);
}
t->setRight(createTree());
if(t->right!=nullptr){
t->right->setParent(t);
}
}
return t;
}
//先序遍历写多了吧,无脑递归形式
//先对当前结点稍微处理一下,然后开始递归左右
void PreOrder(Node *t){
if(t==nullptr){
return;
}
//该t结点的左右结点都为空,说明它是叶子结点,那就存起来
if(t->right==nullptr&&t->left==nullptr){
q.emplace(t);
cout<<t->data<<" ";
}
PreOrder(t->left);
PreOrder(t->right);
}
//下面两get函数使用clion自动生成,俩函数目的就是获取队列和根节点
const queue<Node *> &getQ() const {
return q;
}
Node *getRoot() const {
return root;
}
};
int main(){
//n次循环,找n个二叉树的叶结点及其父结点
int n;
cin>>n;
for(int i=0;i<n;i++){
//s为二叉树的“字符串形式”
string s;
cin>>s;
Tree *tree=new Tree();
tree->create(s);
//对该树进行先序遍历,找到叶子结点并存起来
//还对叶子结点进行输出
cout<<"叶子结点: ";
tree->PreOrder(tree->getRoot());
//下面的队列q存的都是叶子结点
queue<Node*> q=tree->getQ();
cout<<endl<<"双亲结点: ";
while(!q.empty()){
cout<<q.front()->parent->data<<" ";
q.pop();
}
cout<<endl;
}
return 0;
}
输入:
3
AB0C00D00
AB00C00
ABCD0000EF000
输出:
叶子结点: C D
双亲结点: B A
叶子结点: B C
双亲结点: A A
叶子结点: D F
双亲结点: C E
我是花花,祝自己也祝您变强了~