982: 输出利用二叉树存储的普通树的度
题目链接-982: 输出利用二叉树存储的普通树的度
题目描述
普通树可转换成相应的二叉树(该二叉树的根结点一定缺少右儿子),反之亦然。故而可以根据相应的转换方法去统计某一二叉树对应的普通树的度。普通树的度为其结点儿子数的最大值。相应的二叉树可利用二叉树的先序递归遍历算法创建。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#“时表示该结点不需要创建,否则创建该结点。最后再统计该二叉树对应的森林中树的棵数。需要注意输入数据序列中的”#"字符的序列及个数关系,这会最终决定创建的二叉树的形态(序列里面允许无效字符但需要正确处理)。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)
输出
若表示的二叉树对应普通树,则该普通树的度;否则输出ERROR。
样例输入
AB#CD##E###
ABC####
AB##C##
ABCD###EF##G###
A##B##
样例输出
3
1
ERROR
3
1
解题思路
- 将普通树用二叉树来表示:
- 普通树中节点的兄弟节点可以转化为二叉树中该节点的右节点
- 普通树中节点的子节点可以转化为二叉树中该节点的左节点
- 因为数据结构中树的度是树内各结点的度的最大值,所以找普通树的度其实就是在二叉树中所有节点左子树所含有的右节点数的最大值
- 普通树可转换成相应的二叉树,该二叉树的根结点一定缺少右儿子,否则表示的二叉树不对应普通树,输出
ERROR
- 具体操作见代码
附上代码
#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 *right,*left;
}*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 maxn;
void Count(node *&p,int cnt){//计数
if(p==NULL)
return ;
Count(p->left,1);//计算新的左子树所含有的右节点数,cnt置为1
Count(p->right,cnt+1);//cnt+1用来计数
maxn=max(maxn,cnt); //每次操作取最大值
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
build(p);
if(p->right!=NULL)
cout<<"ERROR";
else{
Count(p,0);
cout<<maxn;
}
return 0;
}