知识点

完全二叉树 层序遍历

思路

题目要求统计0和1的数量,分别在根节点的左右子树建立完全二叉树,然后返回根节点。

我们遍历数组统计0和1的个数,之后利用层序遍历(BFS)的方法建立完全二叉树,并返回根节点作为答案的左右子树。具体见代码。

时间复杂度

由于只会建立n个节点并每个节点遍历一次,时间复杂度为O(n)

AC code (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) {
        vector<int> cnt(2);
        for (auto x : cows) {
            cnt[x] += 1;
        }
        TreeNode* root = new TreeNode(-1);
        root->left = get(cnt[0], 0);
        root->right = get(cnt[1], 1);
        return root;
    }
    TreeNode* get(int k, int val) {
        if (!k) return nullptr;
        auto res = new TreeNode(val);
        k --;
        queue<TreeNode*> q;
        q.push(res);
        while (k > 0) {
            if (k >= 2) {
                auto t = q.front();
                q.pop();
                t->left = new TreeNode(val);
                t->right = new TreeNode(val);
                k -= 2;
                q.push(t->left);
                q.push(t->right);
            }
            else {
                auto t = q.front();
                q.pop();
                t->left = new TreeNode(val);
                k -= 1;
                q.push(t->left);
            }
        }
        return res;
    }
};