题解 | #牛群的二叉树排序#
- 题目考察的知识点
完全二叉树的定义,层次遍历
- 题目解答方法的文字分析
如果二叉树的深度为k,则除第k层外其余所有层节点的度都为2,且叶子节点从左到右依次存在。也即是,将满二叉树的最后一层从左到右依次删除若干节点就得到完全二叉树。
首先统计cows数组中0和1的个数zeroNum和oneNum,然后建立值为-1的头节点head。然后,调用dfs(zeroNum,0)方法创建个数为zeroNum,节点值皆为0的完全二叉树,赋值给head的左子树。head的右子树同理。
dfs方法讲解:运用层次遍历,创建完全二叉树,将所有没有左右子树的节点放进队列中,节点出栈时将,分别为节点加上左右节点。直到sum为0
- 本题解析所用的编程语言
java
- 完整且正确的编程代码
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) {
int zeroNum = 0,oneNum=0;
for(int i=0;i<cows.length;i++){
if(cows[i]==0){
zeroNum++;
}else{
oneNum++;
}
}
TreeNode head = new TreeNode(-1);
head.left= dfs(zeroNum,0);
head.right= dfs(oneNum,1);
return head;
}
public TreeNode dfs(int sum,int val){
if(sum==0){
return null;
}
TreeNode head = new TreeNode(val);
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(head);
sum--;
while(sum > 0){
TreeNode cur = queue.poll();
cur.left= new TreeNode(val);
queue.offer(cur.left);
sum--;
if(sum>0){
cur.right= new TreeNode(val);
queue.offer(cur.right);
sum--;
}else{
break;
}
}
return head;
}
}