这是我最近遇到的面试问题之一。
给定一棵完全或几乎完全二叉树的根地址,我们必须编写一个函数将二叉树转换为最大堆。
这里不涉及数组。树已经构建好了。
例如,
1
/ \
2 5
/ \ / \
3 4 6 7
可以有任何可能的最大堆作为输出——
7
/ \
3 6
/ \ / \
2 1 4 5
或者
7
/ \
4 6
/ \ / \
2 3 1 5
ETC...
我写了一个解决方案,但使用了前后顺序遍历的组合,但我猜它在 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;
}