输出利用先序遍历创建的二叉树中的指定结点的双亲结点
1000(ms)
10000(kb)
1893 / 4540
利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的双亲结点。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符“#”时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树中的指定结点的双亲结点。注意输入数据序列中的“#”字符和非“#”字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入
输入用例分2行输入,第一行接受键盘输入的由大写英文字符和“#”字符构成的一个字符串(用于创建对应的二叉树),第二行为指定的结点数据。
输出
用一行输出该用例对应的二叉树中指定结点的双亲结点。若相应双亲结点不存在则以“#”代替。
样例输入
A## A ABC#### B
样例输出
# A
思路:大致就是找它的左右儿子是否和查找相等,如果相等就输出该父节点的值,如果没查找到就做好标记。
#include<iostream>
#include<stdlib.h>using namespace std;
typedef struct node
{
char data;
struct node *r,*l;
}Tree;
int flag=1;
void init(Tree *&l)
{
char ch;
cin>>ch;
if(ch=='#') l=NULL;
else
{
l=(Tree *)malloc(sizeof(Tree));
l->data=ch;
init(l->l);
init(l->r);
}
}
void print(Tree *l,char ch)
{
if(l)
{
if(l->l!=NULL&&l->l->data)
{
cout<<l->data;
flag=0;
return ;
}
if(l->r!=NULL&&l->r->data==ch)
{
cout<<l->data;
flag=0;
return ;
}
if(l->l!=NULL) print(l->l,ch);
if(l->r!=NULL) print(l->r,ch);
}
}
int main()
{
Tree *l;
init(l);
char ch;
cin>>ch;
print(l,ch);
if(flag){
cout<<"#";
}
return 0;
}