LeetCode 2471. Minimum Number of Operations to Sort a Binary Tree by Level

95 阅读1分钟

🔗 leetcode.com/problems/mi…

题目

  • 给一个二叉树,进行若干交换操作,使得每层的数字都是严格升序的
  • 返回至少要进行几次这样的操作

思路

  • 队列,按照层级遍历
  • 针对每一层,统计至少要经过几次交换的操作,可以严格升序
  • 交换操作用贪心的方法:当前位置的数据是否是排序后所处的位置,若不是,经过一次交换,把当前的元素,交换至排序后所处的位置

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int minimumOperations(TreeNode* root) {
        int count = 0;
        queue<TreeNode*> que;
        que.push(root);
        while (!que.empty()) {
            int size = que.size();
            vector<int> vec1, vec2;
            while (size--) {
                auto* node = que.front(); que.pop();
                vec1.push_back(node->val);
                vec2.push_back(node->val);
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
            sort(vec2.begin(), vec2.end());
            unordered_map<int, int> mp;
            for (int i = 0; i < vec2.size(); i++) {
                mp[vec2[i]] = i;
            }

            for (int i = 0; i < vec1.size(); i++) {
                while (mp[vec1[i]] != i) {
                    count++;
                    swap(vec1[i], vec1[mp[vec1[i]]]);
                }
            }
        }
        return count;
        
    }
};