ber_ker 2024-05-05 12:22 采纳率: 44.4%
浏览 0

站外问题水题【23767】

img


也给我前额叶废物欺负她我饿GIFwig腐恶问他高发期哥特我给他IWC

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-05 12:26
    关注

    引自免费微信小程序:皆我百晓生

    为了解决这个问题,我们可以采用贪心策略。首先,我们需要遍历整个树,找到最深的一层的所有节点,然后从这一层开始,将它们转换成完全二叉树。我们可以通过检查每个节点是否有两个孩子来确定是否为完全二叉树。

    以下是实现这个算法的C++代码:

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    
    struct TreeNode {
        int val;
        TreeNode* left;
        TreeNode* right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    int minOperations(TreeNode* root) {
        if (root == NULL) return 0;
    
        vector<int> depths; // 存储每个节点的深度
        queue<TreeNode*> q;
        q.push(root);
        depths.resize(n + 1, -1); // 初始化所有节点的深度为-1,除了根节点设为0
        depths[root->val] = 0;
    
        while (!q.empty()) {
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                TreeNode* node = q.front(); q.pop();
                if (node->left != NULL) {
                    depths[node->left->val] = depths[node->val] + 1;
                    q.push(node->left);
                }
                if (node->right != NULL) {
                    depths[node->right->val] = depths[node->val] + 1;
                    q.push(node->right);
                }
            }
        }
    
        int maxDepth = *max_element(depths.begin(), depths.end());
        int result = 0;
    
        // 从最深一层开始处理,直到根节点
        for (int depth = maxDepth; depth > 0; --depth) {
            for (auto& node : depths) {
                if (node == depth && (node->left == NULL || node->right == NULL)) {
                    if (node->left == NULL) {
                        result++; // 插入左子节点
                    } else if (node->right == NULL) {
                        result++; // 插入右子节点
                    } else {
                        result += 2; // 删除叶子节点
                    }
                }
            }
            depths.erase(remove_if(depths.begin(), depths.end(), [](int d) { return d == depth; }), depths.end());
        }
    
        return result;
    }
    
    int main() {
        int n;
        cin >> n;
        vector<pair<int, int>> edges(n);
        for (int i = 0; i < n; ++i) {
            cin >> edges[i].first >> edges[i].second;
        }
    
        // 构建二叉树
        TreeNode* root = new TreeNode(1);
        for (const auto& edge : edges) {
            if (edge.first != 0) {
                TreeNode* parent = root;
                for (int i = 1; i < edge.first; ++i) {
                    parent = parent->left ? parent->left : parent->right;
                }
                if (parent->left == NULL) {
                    parent->left = new TreeNode(edge.second);
                } else {
                    parent->right = new TreeNode(edge.second);
                }
            }
        }
    
        cout << minOperations(root) << endl;
    
        // 清理内存
        delete root;
        return 0;
    }
    

    这段代码首先构建了给定的二叉树,然后计算每个节点的深度,并根据这些信息计算所需的最小操作次数。注意,这里假设输入的二叉树是有效的,即对于每个非叶子节点,其左子节点编号小于其右子节点编号,且所有节点编号都是唯一的。如果这些假设不成立,你需要在构建二叉树之前添加一些额外的错误检查。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月5日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据