982: 输出利用二叉树存储的普通树的度
题目描述
普通树可转换成相应的二叉树(该二叉树的根结点一定缺少右儿子),反之亦然。故而可以根据相应的转换方法去统计某一二叉树对应的普通树的度。普通树的度为其结点儿子数的最大值。相应的二叉树可利用二叉树的先序递归遍历算法创建。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#“时表示该结点不需要创建,否则创建该结点。最后再统计该二叉树对应的森林中树的棵数。需要注意输入数据序列中的”#"字符的序列及个数关系,这会最终决定创建的二叉树的形态(序列里面允许无效字符但需要正确处理)。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。
输出
若表示的二叉树对应普通树,则该普通树的度;否则输出ERROR。
样例输入
AB#CD##E###
ABC####
AB##C##
ABCD###EF##G###
A##B##
样例输出
3
1
ERROR
3
1
思路:
树转二叉树方法:
- 普通树中节点的兄弟节点 ->二叉树中该节点的右节点
- 普通树中节点的子节点 ->二叉树中该节点的左节点
所以寻找普通树的度就是二叉树中所有节点右孩子数加一。
#include<bits/stdc++.h>
using namespace std;
int m=0;
typedef struct tree
{
char data;
struct tree *lchild, *rchild;
}tree;
void creat(tree *&t)//种树
{
char ch;
cin >> ch;
if(ch=='#')
{
t=NULL;
}
else
{
t=new tree();
t->data=ch;
creat(t->lchild);
creat(t->rchild);
}
}
void f(tree *&t, int n)//数树
{
if(t!=NULL)//树非空
{
f(t->rchild, n+1);//左孩子数不变
f(t->lchild, 1);//右孩子数加一
}
m=n>m?n:m; //m存储最多右孩子数
}
int main()
{
tree *t;
int n=1;//最开始度为1
creat(t);
if(t->rchild==NULL)
{
f(t, 1);
cout << m;
}
else//如果根结点有右孩子结点,则说明不止一棵树
cout << "ERROR";
return 0;
}
以上方法仅供参考,欢迎互联网广大朋友们提出指正。