大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
本题考察了树的构建和遍历,队列的应用,以及对题目要求的理解和实现能力。
题目解答方法的文字分析
题目要求将牛按照指定规则排序,并构建一个满足条件的二叉树。根据题目描述,根节点的值为-1,0在左子树,1在右子树,并且左右子树都必须是完全二叉树。解决方法如下:
- 统计数组中0和1的数量,分别记为 zeroNums和oneNums。
- 创建根节点 res,值设为-1。
- 调用 buildTree函数分别构建左子树和右子树,传入对应的节点数和节点值。
- 将左子树和右子树分别连接到根节点的左子节点和右子节点。
- 返回根节点 res。
函数 buildTree 的步骤如下:
- 如果节点数为0,返回空指针。
- 创建根节点 root,值为传入的节点值n。
- 使用队列 layer来逐层构建二叉树,首先将根节点入队。
- 在循环中,每次取出队列首元素 s,如果还有未创建的节点,并且s的左子节点为空,就调用createNodeAndEnqueue函数创建一个值为n的左子节点,并将其入队。
- 如果还有未创建的节点,并且 s的右子节点为空,就调用createNodeAndEnqueue函数创建一个值为n的右子节点,并将其入队,同时将队列首元素出队列。
- 继续循环直到所有节点都被创建完毕。
- 返回根节点 root。
函数 createNodeAndEnqueue 的步骤如下:
- 创建一个节点 node,值为传入的节点值n。
- 将节点 node入队列。
- 返回节点 node。
本题解析所用的编程语言
本题解析所用的编程语言是C++。
完整且正确的编程代码
/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <cstddef>
#include <queue>
class Solution {
public:
    TreeNode* sortCowsTree(vector<int>& cows) {
        TreeNode* res = new TreeNode(-1); // 创建根节点,值为-1
        int zeroNums = 0;
        int oneNums = 0;
        
        // 统计数组中0和1的数量
        for (int i = 0; i < cows.size(); i++) {
            if (cows[i] == 0) {
                zeroNums++;
            } else {
                oneNums++;
            }
        }
        
        // 构建左子树和右子树
        TreeNode* l = buildTree(zeroNums, 0); // 0为左子树的值
        TreeNode* r = buildTree(oneNums, 1);  // 1为右子树的值
        
        res->left = l;
        res->right = r;
        
        return res;
    }
    // 构建满足要求的子树,nums为节点数目,n为节点的值
    TreeNode* buildTree(int nums, int n) {
        if (nums == 0) return NULL; // 如果节点数为0,返回空指针
        TreeNode* root = new TreeNode(n); // 创建根节点,值为n
        nums--;
        queue<TreeNode*> layer;
        layer.push(root);
        while (nums > 0) {
            TreeNode* s = layer.front(); // 取出队列首元素
            if (nums > 0 && s->left == NULL) {
                s->left = createNodeAndEnqueue(&layer, n, nums);
                nums--;
                continue;
            }
            if (nums > 0 && s->right == NULL) {
                s->right = createNodeAndEnqueue(&layer, n, nums);
                nums--;
                layer.pop(); // 当右子节点创建后,将首元素出队列
            }
        }
        
        return root;
    }
    // 创建节点并将节点入队列
    TreeNode* createNodeAndEnqueue(queue<TreeNode*>* layer, int n, int& nums) {
        TreeNode* node = new TreeNode(n); // 创建节点,值为n
        layer->push(node); // 入队列
        return node;
    }
};

 京公网安备 11010502036488号
京公网安备 11010502036488号