2471。依等級對二元樹進行排序的最少操作數
難度:中
主題:樹、廣度優先搜尋、二元樹
您將獲得一個二元樹的根,其中具有唯一值。
在一次操作中,您可以選擇任兩個同一層級的節點並交換它們的值。
傳回使每個等級的值依嚴格遞增順序排序所需的最少操作數.
節點的等級是它與根節點之間的路徑上的邊數。
範例1:
範例2:
範例 3:
約束:
提示:
解:
這個問題是關於以最少的運算元嚴格升序對二元樹的值進行逐級排序。在每次操作中,我們可以交換同一層級的兩個節點的值。目標是確定實現排序順序所需的此類操作的最少數量。
讓我們用 PHP 實作這個解:2471。依等級對二元樹進行排序的最少操作數
<?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?>
第1步:執行BFS以層級將節點分組:
第 2 步:對於每個級別,計算對值進行排序的最小交換:
循環分解:
回傳交換總數:
輸入樹:
<?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?>
等級:
1 級: [4, 3]
2 級:[7,6,8,5]
3 級: [9, 10]
總交換次數 = 1(1 級)2(2 級)= 3 次交換。
輸出:3
輸入樹:
1 / \ 4 3 / \ / \ 7 6 8 5 \ 9 \ 10
等級:
1 級: [3, 2]
2 級:[7,6,5,4]
總交換次數 = 1(1 級)2(2 級)= 3 次交換。
輸出:3
因此,總體時間複雜度為O(N log N),在給定約束的情況下,這已經足夠高效了。
對於輸入樹:
<?php /** * @param TreeNode $root * @return Integer */ function minimumOperations($root) { ... ... ... /** * go to ./solution.php */ } /** * Function to calculate minimum swaps to sort an array * * @param $arr * @return int */ function minSwapsToSort($arr) { ... ... ... /** * go to ./solution.php */ } ?>
輸出為 3 次交換,如範例中詳述。
此解決方案透過使用 BFS 按層級對節點進行分組並循環分解來有效計算對二元樹的每個層級進行排序所需的最小交換次數,以最小化交換次數。 O(N log N) 的時間複雜度是處理最多具有 10^5 個節點的樹的最佳選擇。
聯絡連結
如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!
如果您想要更多類似的有用內容,請隨時關注我:
以上是按級別對二元樹進行排序的最少操作數的詳細內容。更多資訊請關注PHP中文網其他相關文章!