algorithm - 最大堆化二叉树

标签 algorithm data-structures heap binary-tree binary-heap

这是我最近遇到的面试问题之一。

给定一棵完整或几乎完整的二叉树的根地址,我们必须编写一个函数将树转换为最大堆。

这里不涉及数组。树已经构建完成。

例如,

              1   
         /         \
        2           5
      /   \       /   \ 
     3      4    6     7

可以将任何可能的最大堆作为输出--

              7   
         /         \
        3           6
      /   \       /   \ 
     2     1     4     5

              7   
         /         \
        4           6
      /   \       /   \ 
     2     3     1     5

等...

我写了一个解决方案,但结合使用了顺序遍历和顺序遍历,但我猜它的运行时间为 O(n^2)。我的代码给出了以下输出。

              7   
         /         \
        3           6
      /   \       /   \ 
     1     2     4     5

我一直在寻找更好的解决方案。有人可以帮忙吗?

编辑:

我的代码

void preorder(struct node* root)
{    
    if(root==NULL)return;
    max_heapify(root,NULL);
    preorder(root->left); 
    preorder(root->right);
}
void max_heapify(struct node* root,struct node* prev)
{
    if(root==NULL)
        return ;             
    max_heapify(root->left,root);
    max_heapify(root->right,root);
    if(prev!=NULL && root->data > prev->data)
    {
        swapper(root,prev);
    }     
}
void swapper(struct node* node1, struct node* node2)
{   
    int temp= node1->data;
    node1->data = node2->data;
    node2->data = temp;
}

最佳答案

我认为这可以通过以下过程在 O(NlogN) 时间内完成。 http://www.cs.rit.edu/~rpj/courses/bic2/studios/studio1/studio121.html

假设树中有一个元素,它的左右子树都是堆。

          E
       H1   H2

这棵由 E、H1 和 H2 组成的树可以通过使元素 E 游到其正确位置而在 logN 时间内堆积。

因此,我们开始自下而上地构建堆。转到最左边的子树并通过简单比较将其转换为堆。对它的 sibling 也这样做。然后上去转成堆。

对每个元素都这样做。

编辑:如评论中所述,复杂度实际上是 O(N)。

关于algorithm - 最大堆化二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24801613/

相关文章:

java - 最短路径链表

algorithm - 如何将数组间隔中的所有值递增给定数量

java - 计算树中的左子节点

c++ - 从堆移除中筛选

import - SQL Developer 不会尝试导入 .xlsx 文件,因为它太大

algorithm - 对字符串中所有子字符串的不同字符数求和

c - 方阵置换

c++ - 堆二叉树是否必须完成才能成为堆?

java - 谁能帮我理解这段代码?

python - self 加入 Pandas