1051: 输出利用先序遍历创建的二叉树中的指定结点的孩子结点
题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的儿子结点。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#“时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树中的指定结点的儿子结点。注意输入数据序列中的”#“字符和非”#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入
输入用例分2行输入,第一行接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树),第二行为指定的结点数据。
输出
用一行输出该用例对应的二叉树中指定结点的儿子结点,格式为:L:,R:。若相应儿子不存在则以"#"。
样例输入
A##
A
ABC####
B
样例输出
L:#,R:#
L:C,R:#
思路:
- 先序遍历输入数据
- 先序遍历查找结点(注意递归结束条件:t != NULL)
- 找到时:
①左孩子非空时,打印…
②右孩子非空时,打印…
③左右孩子非空时,打印… - 未找到时:
①左孩子非空时,递归查找
②右孩子非空时,递归查找
tips:这道题C+也是可以的,不过今天缓一缓使用C语言。
#include<bits/stdc++.h>
typedef struct tree
{
char data;
struct tree *lchild, *rchild;
}tree;
void creat(tree *&t)//种树
{
char ch;
scanf("%c", &ch);
if(ch=='#')
{
t=NULL;
}
else
{
t=(tree *)malloc(sizeof(tree));
t->data=ch;
creat(t->lchild);
creat(t->rchild);
}
}
void f(tree *&t, char a)
{
if(t!=NULL)//递归终止条件
{
if(t->data==a)
//找到那个结点,这里我耍了一点小聪明可以降低代码量
{
if(t->lchild==NULL)//数据左孩子为空时
printf("L:#,");
else //数据左孩子非空时
printf("L:%c,", t->lchild->data);
if(t->rchild==NULL)//数据右孩子为空时
printf("R:#");
else //数据右孩子非空时
printf("R:%c", t->rchild->data);
}
else if(t->data!=a)//未找到那个结点
{
if(t->lchild!=NULL)//左孩子非空,递归查找
f(t->lchild, a);
if(t->rchild!=NULL)//右孩子非空,递归查找
f(t->rchild, a);
}
}
}
int main()
{
tree *t=NULL;
char a;
creat(t);
getchar();
scanf("%c", &a);
f(t,a);
return 0;
}
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。