考察的知识点:二叉树的构建;
解答方法分析:
- 首先创建一个根节点,值为-1,并初始化零的计数变量
zeros
和一的计数变量ones
为0。 - 遍历给定的
cows
数组,如果元素为0则零的计数变量加1,否则一的计数变量加1。 - 如果零的计数变量
zeros
大于0,则创建一个根的左孩子,并赋值为0,调用makeTree
函数构建左子树,参数为左孩子节点、zeros - 1
和0。 - 如果一的计数变量
ones
大于0,则创建一个根节点的右孩子,并赋值为1,调用makeTree
函数构建右子树,参数为右孩子节点、ones - 1
和1。 - 返回构建好的二叉树的根节点。
所用编程语言: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--; } } } };