开发者社区> 问答> 正文

堆如果用二叉链表表示成二叉树,用递归算法判断是否为堆?求思想求算法

堆如果用二叉链表表示成二叉树,用递归算法判断是否为堆?求思想求算法

展开
收起
知与谁同 2018-07-21 18:19:23 1854 0
1 条回答
写回答
取消 提交回答
  • 阿里云开发者社区运营负责人。原云栖社区负责人。
    堆的判定条件为,对于队中的任意子树其根元素和其左右孩子元素之间的关系需要符合堆的定义,例如大顶堆需要保证根结点的值大于等于其左右孩子的值,小顶堆则反之。
    算法如下:
    1. 指定一个树的根结点,判断根结点与左孩子以及右孩子的关系是否满足堆的要求。
    2. 若不满足则返回不是堆
    3. 若满足则递归的遍历左子树和右子树重复1的步骤,直到整个树被遍历完成。
    例如判断大顶堆,实现如下:
    1. 调用方法heapJudge(&root); //参数为二叉树的根节点
    2. heapJudge方法实现如下
    bool heapJudge(TreeNode *root)
    {
    bool bReturnLeft = false;
    bool bReturnRight = false;
    if (root == null) //为空返回true,说明到此为止依然是符合堆的条件的
    {
    return true;
    }
    //左节点的数据大于根结点数据说明不是大顶堆返回false
    if ((root->left != null) && (root->data < root->left->data))
    {
    return false;
    }
    //右节点的数据大于根结点数据说明不是大顶堆返回false
    if ((root->right != null) && (root->data < root->right->data))
    {
    return false;
    }
    //遍历左子树
    bReturnLeft = heapJudge(root->left);
    //遍历右子树
    bReturnRight = heapJudge(root->right);
    //返回两个子树的结果,其中有一个不符合则说明不是堆
    return (bReturnLeft&&bReturnRight);
    }
    2019-07-17 22:55:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载