题解 | #牛群的二叉树排序# java
牛群的二叉树排序
https://www.nowcoder.com/practice/a3a8756cbb13493ab4cf5d73c853d5cd
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param cows int整型一维数组 * @return TreeNode类 */ public TreeNode sortCowsTree (int[] cows) { // write code here // 创建根节点并初始化为-1 TreeNode root = new TreeNode(-1); // 使用两个队列分别存储当前层级的节点 Queue<TreeNode> q0 = new LinkedList<>(); Queue<TreeNode> q1 = new LinkedList<>(); // 将根节点加入队列中 q0.offer(root); q1.offer(root); // 遍历整数数组 for (int i = 0; i < cows.length; ++i) { if (cows[i] == 0) { // 如果当前值为0 // 创建一个新节点,并将其作为当前层级节点的左子节点或右子节点(根据情况而定) TreeNode node = new TreeNode(0); if (q0.peek().left == null) { // 如果当前层级节点的左子节点为空 q0.peek().left = node; // 将新节点设置为左子节点 if (q0.peek() == root) { // 如果当前层级节点是根节点 q0.poll(); // 从队列中移出 } } else { // 如果当前层级节点的左子节点不为空 q0.peek().right = node; // 将新节点设置为右子节点 q0.poll(); // 从队列中移出 } q0.offer(node); // 将新节点加入队列中 } else { // 如果当前值为1 // 创建一个新节点,并将其作为当前层级节点的右子节点 TreeNode node = new TreeNode(1); if (q1.peek() != root && q1.peek().left == null) { // 如果当前层级节点不是根节点且左子节点为空 q1.peek().left = node; // 将新节点设置为左子节点 } else { // 如果当前层级节点是根节点或者左子节点不为空 q1.peek().right = node; // 将新节点设置为右子节点 q1.poll(); // 从队列中移出 } q1.offer(node); // 将新节点加入队列中 } } // 返回根节点,即为转换后的二叉树 return root; } }
该Java代码使用Java编程语言编写。
该题考察的知识点是二叉树的构建和层次遍历。
这段代码实现了一个方法sortCowsTree
,用于将给定的整数数组cows
转换为二叉树。具体实现步骤如下:
- 创建根节点
root
,初始值为-1,并且创建两个队列q0
和q1
,分别用于存储当前层级的节点。 - 将根节点
root
加入队列q0
和q1
中。 - 遍历整数数组
cows
,根据数组元素的值(0或1)来构建二叉树。 - 若当前值为0,创建一个新节点,并将其作为当前层级节点的左子节点或右子节点。如果当前层级节点的左子节点为空,则将新节点设置为左子节点;否则,将新节点设置为右子节点。如果当前层级节点是根节点,则将其从队列
q0
中移出。最后,将新节点加入队列q0
中。 - 若当前值为1,创建一个新节点,并将其作为当前层级节点的右子节点。如果当前层级节点不是根节点且左子节点为空,则将新节点设置为左子节点;否则,将新节点设置为右子节点。如果当前层级节点是根节点或左子节点不为空,则将其从队列
q1
中移出。最后,将新节点加入队列q1
中。 - 完成整个数组的遍历后,返回根节点
root
,即为转换后的二叉树。
这段代码使用两个队列来分别存储当前层级的节点,通过队列的特性实现了层次遍历的效果。根据数组元素的值,逐个创建节点,并将节点连接到相应的位置上,最终构建出二叉树。