1.题目:
Problem Description
二叉树的宽度是指二叉树各层结点数的最大值。设有一棵二叉树,其节点值为字符型并假设各值互不相等,采用二叉链表存储表示。设计一个算法,输出该二叉树的宽度。空二叉树的宽度为0。
Input
第一行为一个整数n,表示以下有n组数据,每组数据占一行,为扩展二叉树的前序遍历序列。
Output
输出该二叉树的宽度。
Sample Input
3
AB#D##C##
ABD##E##C#F##
HDA##C#B##GF#E###
Sample Output
2
3
3
2.参考代码:
#include <iostream>
#include <string.h>
using namespace std;
struct BiNode{
char data;
int cnt;
BiNode* lchild,* rchild;
};
class BiTree{
private:
BiNode* root;
BiNode* Creat();
void Release(BiNode* root);
public:
BiTree();
~BiTree();
BiNode* GetRoot(){
return root;
}
int cal(BiNode* root);
};
BiNode* BiTree::Creat(){
BiNode* root;
char ch;
cin>>ch;
if(ch=='#')
root=NULL;
else{
root=new BiNode;
root->data=ch;
root->cnt=0; ///初始化宽度为0
root->lchild=Creat();
root->rchild=Creat();
if(root->lchild==NULL && root->rchild==NULL) ///如果左右字数都为空,则宽度为1
root->cnt=1;
}
return root;
}
void BiTree::Release(BiNode* root){
if(root){
Release(root->lchild);
Release(root->rchild);
delete root;
}
}
BiTree::BiTree(){
root=Creat();
}
BiTree::~BiTree(){
Release(root);
}
int BiTree::cal(BiNode* root){
if(root){
if(root->lchild)
root->cnt+=cal(root->lchild); ///计算左子树的宽度
if(root->rchild)
root->cnt+=cal(root->rchild); ///计算右子树的宽度
return root->cnt; ///总的宽度就是左右子树的宽度之和
}
else
return 0; ///如果结点为空,则宽度为0
}
int main()
{
int n;
cin>>n;
while(n--)
{
BiTree bt;
BiNode* root=bt.GetRoot();
cout<<bt.cal(root)<<endl;
}
return 0;
}