求二叉树的宽度
【问题描述】
以二叉链表为存储结构,编写算法求二叉树的宽度(具有结点数最多的那一层上的节点个数)。
【输入形式】两行,第一行是扩展二叉树的前序遍历序列。
【输出形式】二叉树的宽度。
【样例输入】AB#D##C##
【样例输出】 2
#include<iostream>
#include<queue>
#include<deque>
using namespace std;
template<typename DataType>
struct BiNode
{
DataType data;
BiNode<DataType> *lchild,*rchild,*next;
};
template <typename DataType>
class BiTree
{
public:
BiTree()
{
root=Creat();
}
int width();
queue<BiNode<DataType>*> d;
private:
BiNode<DataType> *Creat();
BiNode<DataType> *root;
};
template<typename DataType>
BiNode<DataType> *BiTree<DataType>::Creat()
{
BiNode<DataType> *bt;
char ch;
cin>>ch;
if(ch=='#') bt=NULL;
else
{
bt=new BiNode<DataType>;
bt->data=ch;
bt->lchild=Creat();
bt->rchild=Creat();
}
return bt;
}
template<typename DataType>
int BiTree<DataType>::width()
{
if(root == NULL)
return 0;
int maxWidth = 0;
deque<BiNode<DataType>*> d;
d.push_back(root);
while(true)
{
int len = d.size();
if(len == 0)
break;
while(len > 0)
{
BiNode<DataType> *temp = d.front();
d.pop_front();
len--;
if(temp->lchild)
d.push_back(temp->lchild);
if(temp->rchild)
d.push_back(temp->rchild);
}
maxWidth = maxWidth > d.size() ? maxWidth : d.size();
}
return maxWidth;
}
int main()
{
BiTree<char> t;
cout<<t.width()<<endl;
}