考察的知识点:二叉树的构建;

解答方法分析:

  1. 首先创建一个根节点,值为-1,并初始化零的计数变量zeros和一的计数变量ones为0。
  2. 遍历给定的cows数组,如果元素为0则零的计数变量加1,否则一的计数变量加1。
  3. 如果零的计数变量zeros大于0,则创建一个根的左孩子,并赋值为0,调用makeTree函数构建左子树,参数为左孩子节点、zeros - 1和0。
  4. 如果一的计数变量ones大于0,则创建一个根节点的右孩子,并赋值为1,调用makeTree函数构建右子树,参数为右孩子节点、ones - 1和1。
  5. 返回构建好的二叉树的根节点。

所用编程语言:C++;

完整编程代码:↓

/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param cows int整型vector
     * @return TreeNode类
     */
    TreeNode* sortCowsTree(vector<int>& cows) {
        TreeNode* root = new TreeNode(-1);
        int zeros = 0;
        int ones = 0;
        for (int i = 0; i < cows.size(); i++) {
            if (cows[i] == 0) {
                zeros++;
            } else {
                ones++;
            }
        }
        if (zeros > 0) {
            root->left = new TreeNode(0);
            makeTree(root->left, zeros - 1, 0);
        }
        if (ones > 0) {
            root->right = new TreeNode(1);
            makeTree(root->right, ones - 1, 1);
        }
        return root;
    }


    void makeTree(TreeNode* root, int count, int flag) {
        queue<TreeNode*> q;
        q.push(root);
        while (count > 0) {
            TreeNode* node = q.front();
            q.pop();
            node->left = new TreeNode(flag);
            q.push(node->left);
            count--;
            if (count > 0) {
                node->right = new TreeNode(flag);
                q.push(node->right);
                count--;
            }
        }
    }
};