题解 | #牛群的二叉树排序#

牛群的二叉树排序

https://www.nowcoder.com/practice/a3a8756cbb13493ab4cf5d73c853d5cd?tpId=354&tqId=10595840&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D354

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
        Deque<TreeNode> left = new ArrayDeque<>(); 
        Deque<TreeNode> right = new ArrayDeque<>(); 
        TreeNode zero = null; 
        TreeNode one = null; 
        Deque<TreeNode> temp;
        for (int cow : cows) {
            temp = cow == 0 ? left : right;
            if (temp.isEmpty()) { 
                if (cow == 0) {
                    zero = new TreeNode(cow);
                    temp.offerFirst(zero);
                } else {
                    one = new TreeNode(cow);
                    temp.offerFirst(one);
                }
            } else {
                TreeNode treeNode = temp.pollLast();
                TreeNode newNode = new TreeNode(cow);
                if (treeNode.left == null) {
                    treeNode.left = newNode;
                    temp.offerLast(treeNode);
                } else {
                    treeNode.right = newNode;
                }
                temp.offerFirst(newNode);
            }
        }
        TreeNode ans = new TreeNode(-1);
        ans.left = zero;
        ans.right = one;
        return ans;
    }
}

知识点:

树,双端队列

解题思路:

建立两颗树,left为左子树全部存放0的树,right为右子树全部存放1的。

以left举例,使用双端队列存放left树的全部节点。

当循环cows数组cow为0时,我们使用leftDeque,如果leftDeque为空,就直接添加个新树进去。

如果leftDeque不为空,从尾部也就是最早添加的节点取一个出来node,如果这个node的左子树为空,我们就把新的树添加到它的左子树上,再把新的树和node放回到队列中,新树放到leftDeque的头部,node再放回尾部;如果这个node左子树不为空,我们就把右子树设置为新的树,新的树放到leftDeque的头部。

全部评论

相关推荐

昨天 17:48
中山大学 C++
点赞 评论 收藏
分享
美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务