1053: 输出利用先序遍历创建的二叉树中的指定结点的度
题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的度。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符“#”时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树中的指定结点的度。注意输入数据序列中的字符“#”和非“#”字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入
输入用例分2行输入,第一行接受键盘输入的由大写英文字符和“#”字符构成的一个字符串(用于创建对应的二叉树),第二行为指定的结点数据。
输出
用一行输出该用例对应的二叉树中指定结点的度。
样例输入
A##
A
ABC####
B
样例输出
0
1
思路:
- 先序遍历输入数据
- 先序遍历查找结点(注意递归结束条件:t != NULL)
- 找到时(结点值==指定结点值):
①左孩子非空, 度+1;
②右孩子非空,度+1;
完成①②两步后一定得return, 否则会卡死在这 - 未找到时:
①左孩子非空时,递归查找
②右孩子非空时,递归查找
tips:1052~1053这三道题有异曲同工之妙,可以说是换汤不换药的题,刷完一道另外两道也不难求解。
#include<bits/stdc++.h>
using namespace std;
char a;
int sum=0;
typedef struct tree
{
char data;
struct tree *lchild, *rchild;
}tree;
void creat(tree *&t)//种树
{
char ch;
cin >> ch;//类似于scanf("%c",&ch);
if(ch=='#')
{
t=NULL;
}
else
{
t =new tree();//类似于t=(tree *)malloc(sizeof(tree));
t->data=ch;
creat(t->lchild);
creat(t->rchild);
}
}
void f(tree *&t)
{
if(t!=NULL)//递归终止条件
{
if(t->data==a)//找到指定结点
{
if(t->lchild!=NULL)//左非空,度加一
{
sum++;
}
if(t->rchild!=NULL)//有非空,度加一
{
sum++;
}
cout << sum;//类似于printf("%d", &sum);
return ;
}
else//为找到指定结点
{
f(t->lchild);//左孩子递归查找
f(t->rchild);//有孩子递归查找
}
}
}
int main()
{
tree *t;
creat(t);
getchar();//上下都是字符,用getchar()吸收掉空格
cin >> a;//类似于scanf("%c", &a);
f(t);
return 0;
}
以上方法仅供参考,欢迎互联网的广大朋友们提出指正。