• 数据结构与算法参考答案(第十周)


    一、编写算法判别给定二叉树是否为完全二叉树。

    答:

    判断一个树是不是完全二叉树,可以使用BFS算法进行实现。在层序遍历的时候,空结点一定位于最后面。如果中间存在空结点则表明不是完全二叉树。继续执行直至遍历完成。

    该算法实现的伪代码如下:

    /*

        函数名称:判断树是不是完全二叉树

        函数传入:树的根节点指针

        函数返回值类型:bool型 是返回true不是返回false

    */

    bool isCompleteTree(Tree *root) {

        QueueInit(&queue);  //构建一个队列

        if(root == NULL) {  //空树也是完全二叉树

            return true;

        }

        QueuePush(&queue, root -> data);//把根结点压入队列中

        while(!(QueueEmpty(&queue))) {

            Tree *front = QueueFront(&queue);   //取出队首结点

            QueuePop(&queue);   //弹出队首结点

            if(front == NULL) {

                break;  //该层有元素为空

            }

            QueuePush(&queue, front -> left);

            QueuePush(&queue, front -> right);

        }

        while(!(QueueEmpty(&queue))) {

            Tree *front = QueueFront(&queue);   //取出队首结点

            QueuePop(&queue);   //弹出队首结点

            if(front != NULL) {

                return false;   //如果还剩下元素代表不是完全二叉树

            }

        }

        QueueDestory(&queue);   //销毁队列

        return true;

    }

    算法分析:该算法实现的时间复杂度为O(n+e)。是一种对树遍历的高效算法。空间多使用一个队列的空间。

     

    二、对以孩子-兄弟链表表示的树编写计算树的深度的算法。

    答:

    对于该题我们可以用递归的算法进行实现。先将树拓展为森林,再将森林转换为二叉树。如果二叉树根存在,左子树深度加一与右子树深度最大值即为此状态下的深度。

    该算法实现的伪代码如下:

    /*

        函数名称:求树的深度

        函数传入参数:树根节点

        返回值类型:int 树的深度

    */

    int getDepth(Tree *root)

    {

        if(root == NULL)

            return 0;

        else

            return max(1 + getDepth(root -> firstchild), getDepth(root -> nextsibling));

    }

    算法分析:该算法用递归的方式进行实现,思路简洁,代码短小高效。这是解决该问题的较好方法。

    假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母,试编写算法,按树状打印二叉树的算法。

    答:

    观察图表可以知道,字母前面的空格与层数有关。空格个数为层数减一。打印的顺序为中序遍历的逆序列,我们可以通过递归的方法实现打印。

    该算法实现的伪代码如下:

    /*

        函数名称:按要求打印二叉树

        函数传入参数:根节点 与 层数

        函数返回值类型:void

    */

    void PrintAsTree(BiTree *root, int layer) { //i代表所在层次

        if (root) {

            PrintAsTree(root -> rchild, layer + 1); //访问右子树

            for (int j = 0; j < layer - 1; ++j) {

                printf(" ");

            }    

            printf("%c ",  root -> data);

            PrintAsTree(root -> lchild, i + 1); //访问左子树

        }

    }

    算法分析:该算法是由递归实现遍历。由于发现其内在规律,使其代码更加简洁。这是解决该问题较好的算法。

    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    【BZOJ 2844】: albus就是要第一个出场
    BZOJ 2631: tree
    BZOJ1798: [Ahoi2009]Seq 维护序列seq
    Link-Cut Tree指针模板
    bzoj 4916: 神犇和蒟蒻 (杜教筛+莫比乌斯反演)
    【BZOJ 3561】 DZY Loves Math VI
    linux 安装php7.2 以及配置laravel环境(public目录下)
    composer 配置 切换中国镜像
    phpstorm composer 提示php 版本过低的问题调整
    如何在阿里云的虚机 部署laravel项目
  • 原文地址:https://www.cnblogs.com/lightac/p/13558241.html
Copyright © 2020-2023  润新知