gpt4 book ai didi

algorithm - Max-Heapify 二叉树

转载 作者:行者123 更新时间:2023-11-30 16:57:19 26 4
gpt4 key购买 nike

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

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

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

例如,

              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 - Max-Heapify 二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39590373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com