其他分享
首页 > 其他分享> > 求二叉树的宽度

求二叉树的宽度

作者:互联网

【问题描述】
以二叉链表为存储结构,编写算法求二叉树的宽度(具有结点数最多的那一层上的节点个数)。

【输入形式】两行,第一行是扩展二叉树的前序遍历序列。
【输出形式】二叉树的宽度。
【样例输入】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