これは、私が最近遭遇したインタビューの質問の 1 つです。
完全またはほぼ完全なバイナリ ツリーのルート アドレスが与えられた場合、ツリーを最大ヒープに変換する関数を作成する必要があります。
ここには配列は含まれていません。ツリーはすでに構築されています。
たとえば、
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;
}