981: 统计利用二叉树存储的森林中树的棵数
题目描述
普通树及其构成的森林均可转换成相应的二叉树,反之亦然。故而可以根据相应的转换方法去统计某一二叉树对应的森林中树的棵数。相应的二叉树可利用先序递归遍历算法创建。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#“时表示该结点不需要创建,否则创建该结点。最后再统计该二叉树对应的森林中树的棵数。需要注意输入数据序列中的”#“字符和非”#"字符的序列及个数关系,这会最终决定创建的二叉树的形态(序列里面允许无效字符但需要正确处理)。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。
输出
输出该用例对应的二叉树表示的森林中树的棵数。
样例输入
A#B#CD###
ABC####
AB##C##
ABCD###EF##G##H##
A##B##
样例输出
3
1
2
2
1
解题思路
森林与二叉树转换规则:
从二叉树根开始一直往右子树走,一共路过几个节点,对应的森林就有几棵树
- 从根节点开始,若右孩子存在,则把与右孩子结点的连线删除,再查看分离后的二叉树,若其根节点的右孩子存在,则连线删除,直到所有这些根节点与右孩子的连线都删除为止
- 将每棵分离后的二叉树转换为树
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
#define endl '\n'
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ull;
struct node{
char data;
node *left,*right;
}*p;
void build(node *&p){//建树
char c;
cin>>c;
if(c=='#')
p=NULL;
else{
p=new node;
p->data=c;
build(p->left);
build(p->right);
}
}
int cnt;
void find(node *&p){
if(p!=NULL){
cnt++;//计算结点个数
find(p->right);//搜索右子树
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
build(p);
find(p);
cout<<cnt;
return 0;
}