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中文网其他相关文章!