问题描述:
假设以三元组(F,C,L/R)
的形式输入一棵二叉树的诸边(其中F
表示双亲结点的标识,C
标识孩子结点的标识,L/R
标识C
为F
的左孩子或右孩子),且在输入的三元组序列中,C
是按层次顺序出现的。设结点的标识是字符类型。F=^
时C
为根节点标识,若C
也为^
,则标识输入结束。试编写算法,由输入的三元组序列建立二叉树的二叉链表。
输入格式
输入为若干行,每行分别为三个字符,描述如题。
输出格式
输出共一行,为该二叉树的广义表达式。
样例输入
^AL
ABL
ACR
^^L
样例输出
A(B,C)
由三元组建立二叉树
由题意可知,输入分为三种类型,针对于需要判断父节点的情况,采用队列来保存前面的输入。
每一个输入的节点都将加入队列,由于是按层次输入,当前输入的节点的父节点不是队首节点,则队首节点出队列,直至在队首找到自己的父节点
char a,b,c;
queue<TreeNode*>_queue;
TreeNode* root;
while(cin>>a>>b>>c){
if(a == '^'){ //两种特殊情况的判断
if(b == '^'){
break;
}else{
root=new TreeNode(b);
_queue.push(root);
}
}else{
TreeNode* pNode=new TreeNode(b);
TreeNode* temp=_queue.front();
while(temp->val != a && !_queue.empty()){ //在队首找到自己的父节点
_queue.pop();
temp=_queue.front();
}//为父节点创建左/右孩子节点
if(c=='L'){
temp->left=pNode;
}else{
temp->right=pNode;
}
_queue.push(pNode);
}
}
二叉树的广义表输出
二叉树的广义表输出类似于前序遍历,在前序遍历的基础上适当加以括号,逗号,这里采用递归的方法实现。需要注意的是,在前序遍历的基础上,应将对于是否为叶子节点的判断和右兄弟节点的判断作为递归条件。
void OutPut(TreeNode* root){
if(root!=NULL){
cout<<root->val;
if(root->left == NULL && root->right == NULL) return;//叶子节点不做后续括号输出
cout<<"(";
OutPut(root->left);
if(root->right != NULL){ //无右兄弟节点不做逗号输出
cout<<",";
OutPut(root->right);
}
cout<<")";
}
}
完整代码示例
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode{
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x):val(x),left(NULL),right(NULL){}
};
void OutPut(TreeNode* root);
int main(){
char a,b,c;
queue<TreeNode*>_queue;
TreeNode* root;
while(cin>>a>>b>>c){
if(a == '^'){ //两种特殊情况的判断
if(b == '^'){
break;
}else{
root=new TreeNode(b);
_queue.push(root);
}
}else{
TreeNode* pNode=new TreeNode(b);
TreeNode* temp=_queue.front();
while(temp->val != a && !_queue.empty()){ //在队首找到自己的父节点
_queue.pop();
temp=_queue.front();
}//为父节点创建左/右孩子节点
if(c=='L'){
temp->left=pNode;
}else{
temp->right=pNode;
}
_queue.push(pNode);
}
}
OutPut(root);
}
void OutPut(TreeNode* root){
if(root!=NULL){
cout<<root->val;
if(root->left == NULL && root->right == NULL) return;//叶子节点不做后续括号输出
cout<<"(";
OutPut(root->left);
if(root->right != NULL){ //无右兄弟节点不做逗号输出
cout<<",";
OutPut(root->right);
}
cout<<")";
}
}