求二叉树的宽度
作者:互联网
【问题描述】
以二叉链表为存储结构,编写算法求二叉树的宽度(具有结点数最多的那一层上的节点个数)。
【输入形式】两行,第一行是扩展二叉树的前序遍历序列。
【输出形式】二叉树的宽度。
【样例输入】AB#D##C##
【样例输出】
2
分析:
1.建立二叉树 结点
2.输入结点
3.遍历树 寻找最大宽度
4.打印输出
建立二叉树 结点
template <typename DataType>
struct BiNode
{
DataType data;
BiNode<DataType>*lchild,*rchild;
};
template<typename DataType>
class BiTree
{
public:
BiTree()
{
root=Create();
}
int Width();//不用递归调用的函数 不用再在private里写一个同名函数了
private:
BiNode<DataType>*Create();
BiNode<DataType>*root;
};
输入结点
BiNode<DataType>*BiTree<DataType>::Create()
{
BiNode<DataType>*bt;
char ch;
cin>>ch;
if(ch=='#')
bt=NULL;
else
{
bt=new BiNode<DataType>;
bt->data=ch;
bt->lchild=Create();
bt->rchild=Create();
}
return bt;
}
利用函数找最大的宽度
补充一下需要的库函数
c++使用队列函数
基本操作:头文件#include <queue>
push(x) 将x压入队列的末端
pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值
front() 返回第一个元素(队顶元素)
back() 返回最后被压入的元素(队尾元素)
empty() 当队列为空时,返回true
size() 返回队列的长度
int BiTree<DataType>::Width()
{
queue<BiNode<DataType>*>Q;//申请一个队列 队列的类型为结点类型的 :<BiNode<DataType>*>
int w;
if(root==NULL)//树为空 宽度为零
return 0;
else
{
Q.push(root);//根节点入队
w=1;
int maxw;//设一个整形变量 存最大值
maxw=w;
while(!Q.empty())//判断队列是否为空 空了代表遍历完成
{
for(int i=0;i<w;i++)//该结点出队 它的子结点入队
{
if(Q.front()->lchild!=NULL)
Q.push(Q.front()->lchild);
if(Q.front()->rchild!=NULL)
Q.push(Q.front()->rchild);
Q.pop();//该结点出队
}
w=Q.size();
if(maxw<w)//保证每次 maxw都会是最大的
maxw=w;
}
return maxw;
}
主函数
int main()
{
BiTree<char>t1;
cout<<t1.Width();
}
在下是一名小白 如果有不恰当的地方 欢迎指正
标签:BiNode,结点,int,bt,队列,宽度,二叉树 来源: https://blog.csdn.net/weixin_44034024/article/details/104895485