题解 | #牛群的二叉树排序#
牛群的二叉树排序
https://www.nowcoder.com/practice/a3a8756cbb13493ab4cf5d73c853d5cd
大家好,我是开车的阿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;
}
};
阿Q的题解 文章被收录于专栏
阿Q秋招刷过的题
